Benutzer mit den meisten Antworten
Interface flexibel über ref und object als Type

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 Andypublic 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
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
-
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
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?
-
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
-
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.
-
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
-
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
-
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
-
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
-
-
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