none
Interface flexibel über ref und object als Type RRS feed

  • Frage

  • Hallo,
    ich suche nach Möglichkeiten um ein Inferface flexibel zu gestalten.
    Idee:
    EXE -  DLL - Interface
     Funktionen, deren ich ein object mitgebe und einfach dann caste beim Gegenüber caste.

      Vorteil: Definition Interface, das dann auf beiden Seiten einfach zu erweitern wäre.

     Geht nicht richtig, sieht jemand etwas?
          - Wie wäre es korrekt?

          - Ist der Ansatz IO, oder gibt es Besseres?
      Danke und Grüße Andy

     public interface ITestInterface
        {
            int Calculate(ref string info, ref object fromXY);
    		
     string[] IOsignals;
            private void btnPStart_Click(object sender, EventArgs e)
            {
    		// **** A
                string obj = "";
                IOsignals = new string [] {"0","0","0","1","1","1","1","1","0","0","0","1"};
                PluginTest.Calculate(ref obj, ref IOsignals as object);
    			
    		// **** B
                string obj = "";
                int counter = 3;
                PluginTest.Calculate(ref obj, ref counter as object);
    			
    
    // **** C
                int  counter = 8;
                object testA = new object();
                testA = counter;
                PluginTest.Calculate(ref obj, ref testA );
    
    
    	Fehler	1	Ein ref- oder out-Argument muss eine zuweisbare Variable sein.	on.cs	189	53	Simulation

      
    Donnerstag, 7. März 2013 19:05

Antworten

  • Hi Andy,

    mit C++ hab ich das letzte mal vor 10 Jahren gearbeitet und dann auch nur 1 Monat während des Studiums. Bevor ich mich jetzt hingesetzt hab und das Implementiert habe, bist du wahrscheinlich schneller. 

    Wenn ich das jetzt richtig im Kopf habe gibt es in C++ keine Interfaces, sondern man verwendet abstrakte Klassen.

    Wenn es Probleme geben sollte, einfach mal Melden, dann schau ich mal ob ich es in C++ umgesetzt bekommen.

    MFG

    Björn

    • Als Antwort markiert Andy Bauer Samstag, 9. März 2013 20:06
    Samstag, 9. März 2013 13:35
  • IDoSomething ds = new DoSomething();
    ds.DoIt<int>("int", 2);
    ds.DoIt<double>("double", 2.2);

    Hallo,

    Danke. Ich muss eine Assemby erstellen, die ich in C# und C++/MFC CLI nutzen kann.

    Wenn ich die Generic in CLI, C++ auslesen kann, wäre es ein Versuch wert. Kennst Du dich da aus?

    Wie komme ich da an die Parameter?

    Anforderung.

      XML Interface erweiterbar, der wo was braucht liest halt.

      Knoten sind erweiterbar, ohne das sich die Assembly Exe ändert. So was suche ich halt.

      Sicher gebe ich Stefan recht, Schnittstellen sind Verträge die einzuhalten sind. Das ist Fakt.

      Aber bei uns ändert sich dauernd was, das ist das Problem. Der Eine braucht das, der andere noch jenes.

    Grüße Andy

    • Als Antwort markiert Andy Bauer Samstag, 9. März 2013 20:07
    Samstag, 9. März 2013 07:26

Alle Antworten

  • Wozu ein flexibles Interface? Schnittstelllen sollte gerade das Gegenteil davon sein. Denn sie sind im Normalfall die stabilen Punkte an den Systemgrenzen.

    btw, dein Beispiel ist mir nicht ganz klar. Wo soll das denn hinführen? Kannst du das besser, genauer beschreiben?

    Donnerstag, 7. März 2013 20:07
  • Hallo Stefan,

     --------------- EXE A ----         Interface -- DLL 1     

    -----------------------------------Interface -- DLL 2

    Jetzt kann eben sein, dass DLL 3 den Parameter ref object nicht als int sondern als double benötigt.

      Warum auch immer

         Das Interface würde sich dann nicht ändern.

    Sonst müsste ich ein neues erweitertes Interface, sprich Funktion einbauen.

     Die eine App nimmt es, die andere eben nicht.

    Wollte dadurch Flexibilität gewinnen.

    Grüße Andy

    Donnerstag, 7. März 2013 20:32
  • Hi,

    für Flexibiltät würde ich mir eher mal Generics anschauen. Vielleicht erfüllt das ja deine Anforderungen.

    Gruß Chris

    Donnerstag, 7. März 2013 20:35
  • Generics sind da schon ein guter Hinweis von chriga. Aber noch mal: Warum? Das ist sematisch mehrdeutig. Wer will das denn? An dieser Stelle macht das wirklich wenig Sinn. Man spart sich die Arbeit mit vererbten oder komponierten Interfaces für den Effekt das hier ein weiches Ziel übergeben wird. Halte ich absoult nicht für toll. So gut können die Argumente dafür nicht sein.
    Donnerstag, 7. März 2013 20:47
  • für Flexibiltät würde ich mir eher mal Generics anschauen. Vielleicht erfüllt das ja deine Anforderungen.

    Hallo,

    hast da konkret ein Beispiel?

    Hintergrund u.a.

       App1 -----  DLL oder (App2)

    Ähnlich wie XML, der wo den Knoten/die Info braucht liest.

    Grüße Andy

    Freitag, 8. März 2013 05:20
  • Hi,

    mit Generics könntest du sowas wie das hier machen:

    	

    public interface IDoSomething { publicvoid DoIt<T>(string key, T val); } public class DoSomething : IDoSomething { public void DoIt<T>(string key, T val) { Console.WriteLine(string.Format("{0}: {1}", key, val)); // Do something more ... }

    IDoSomething ds = new DoSomething();
    ds.DoIt<int>("int", 2);
    ds.DoIt<double>("double", 2.2);

    Ob dir das weiterhilft, musst du entscheiden. Ich glaub ich hab dein Problem nämlich nicht ganz verstanden.

    Gruß Chris


    • Bearbeitet chriga Freitag, 8. März 2013 17:52
    Freitag, 8. März 2013 16:29
  • IDoSomething ds = new DoSomething();
    ds.DoIt<int>("int", 2);
    ds.DoIt<double>("double", 2.2);

    Hallo,

    Danke. Ich muss eine Assemby erstellen, die ich in C# und C++/MFC CLI nutzen kann.

    Wenn ich die Generic in CLI, C++ auslesen kann, wäre es ein Versuch wert. Kennst Du dich da aus?

    Wie komme ich da an die Parameter?

    Anforderung.

      XML Interface erweiterbar, der wo was braucht liest halt.

      Knoten sind erweiterbar, ohne das sich die Assembly Exe ändert. So was suche ich halt.

      Sicher gebe ich Stefan recht, Schnittstellen sind Verträge die einzuhalten sind. Das ist Fakt.

      Aber bei uns ändert sich dauernd was, das ist das Problem. Der Eine braucht das, der andere noch jenes.

    Grüße Andy

    • Als Antwort markiert Andy Bauer Samstag, 9. März 2013 20:07
    Samstag, 9. März 2013 07:26
  • Hi Andy,

    ja es geht auch mit C++ (google ;) ).

    Was du so beschreibst erinnert mich ein wenig an eine Implementierung des Repository Pattern mit einem IOC Container.

    Als Container kannst du z.B. MEF nutzen, es gibt aber auch noch andere wie Unity, Ninject u.s.w.

    Für das Repository stellst du ein Interface bereit.

    Interface IRepository<T>
    {
     void Add(T entity);
     void Remove(T entity);
     void Update(T entity):
    
     T Get(objekt primaryKey);
     IQueryabel<T> GetEntities();
    }

    Deine speziellen Repositorys Implementieren dann das Interface, wie z.B. das CustomerRepository. Der IOC Container ist dann zur Laufzeit dazu in der Lager, das passende Repository zu finden.

    MFG

    Björn

    Samstag, 9. März 2013 10:53
  • Hallo Palin,

    Danke. Kannst Du noch für C++,CLI, Dein konkretes Beispiel, Dein Interface vordeutlichen.

    MEF ja

    Nur eben mit VS2010 möglich, VS2010, CLI keine IntelliSense.

    VS2012 hat wieder IntelliSense, läuft aber nicht mehr unter WinXP

    Grüße Andy

    Samstag, 9. März 2013 12:50
  • Hi Andy,

    mit C++ hab ich das letzte mal vor 10 Jahren gearbeitet und dann auch nur 1 Monat während des Studiums. Bevor ich mich jetzt hingesetzt hab und das Implementiert habe, bist du wahrscheinlich schneller. 

    Wenn ich das jetzt richtig im Kopf habe gibt es in C++ keine Interfaces, sondern man verwendet abstrakte Klassen.

    Wenn es Probleme geben sollte, einfach mal Melden, dann schau ich mal ob ich es in C++ umgesetzt bekommen.

    MFG

    Björn

    • Als Antwort markiert Andy Bauer Samstag, 9. März 2013 20:06
    Samstag, 9. März 2013 13:35