Autor Beitrag
Dave86
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16


C# (VS 2005 / VS2008)
BeitragVerfasst: Mo 23.02.09 14:04 
Hallo an alle.

Ich hab ein kleines Problem mit den Interfaces in C#. Von c++ kenne ich es, dass ich über einen zeiger direkt funktionen vom Interface aufrufen kann, ohne den Namen der Klasse zu kennen die dieses Interface implementiert.
So etwas suche ich auch in c# bin bis jetzt aber nicht fündig geworden.
Das interface brauche ich zum entkoppeln, darum will ich den namen der implementieren Klasse nicht kennen um flexibel zu sein.

Ich hab mir schon folgenden Thread durchgelesen (typisierter zeiger), ich glaub aber des is nicht des richtige
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 23.02.09 14:16 
Hallo,

mir ist nicht klar, was Du erreichen willst. Du kannst durchaus ein Objekt per Interface deklarieren, dann durch eine Klasse erstellen und anschließend per Interface benutzen:

Deklaration der Klasse in der unten genannten Assembly
ausblenden C#-Quelltext
1:
public class Context : IAdad9Context { ... }					

Nutzung in der Anwendung:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
//  Deklaration per Interface
private IAdad9Context adad9 = null;
    
public void StartAdad9Import(int databaseID) 
{
  Assembly asm = Assembly.Load("VSPolis-Adad9");
  //  erzeuge eine Instanz der Context-Klasse, aber als Interface-Verweis
  adad9 = (IAdad9Context)asm.CreateInstance("JThomas.VSClient.Adad9.Context");
  if (adad9 == null)
    MessageBox.Show("Adad9-Context steht nicht zur Verfügung");
  else  //  benutze die Start-Methode, die im Interface vorgesehen ist
    adad9.Start(this, databaseID);
}

Vielleicht hilft es Dir. Jürgen
Dave86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16


C# (VS 2005 / VS2008)
BeitragVerfasst: Mo 23.02.09 14:26 
Hallo Jürgen.

Danke für deine Antwort. Mir ist klar, dass ich das Interface verwenden kann, aber nur wenn ich eine Klasse kenne die dieses Interface implementiert. Ich will aber verhindern, dass ich diese Klasse kennen muss.

Grüße
Dave
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 23.02.09 15:18 
Irgendein Teil muss doch logischerweise die Klasse kennen, um sie überhaupt instantiieren zu können - anders kann das bei C++ auch nicht funktionieren. Von dort aus kannst du das Objekt dann an Teile übergeben, die die konkrete Klasse nicht mehr zu kennen brauchen.
Vielleicht suchst du auch Dependency Injection. Vereinfacht ausgedrückt verlangst du damit im Code einfach nach einem Interface IFoo, die Klasse dahinter ist zur Compile Time noch nicht bekannt. Erst beim Ausführen wird aus einer Config-Datei ausgelesen, welche Klasse nun dahinter stecken soll. Wenn du in Jürgens Code den Klassennamen dynamisch auslesen würdest, wäre das schon ein Minimalbeispiel für DI.

_________________
>λ=
Dave86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16


C# (VS 2005 / VS2008)
BeitragVerfasst: Mo 23.02.09 15:34 
Hi Kha.

Danke für deine Antwort.

Ich glaube ich hatte da irgendwie einen Denkfehler drin.
Aber die Idee mit der DI is gut danke

Grüße
Dave