webentwicklung-frage-antwort-db.com.de

Instanz einer Schnittstelle erstellen

Ich habe folgende Schnittstellen definiert:

public interface IAudit {
    DateTime DateCreated { get; set; }
}

public interface IAuditable {
    IAudit Audit { get; set; }
}

Die IAuditable-Schnittstelle gibt an, für welche Klassen ich eine Audit habe. Die IAudit-Schnittstelle ist die tatsächliche Audit für diese Klasse. Zum Beispiel sagen Sie, ich habe die folgenden Implementierungen:

public class User : IAuditable {
    public string UserName { get; set; }
    public UserAudit Audit { get; set; }
}

public class UserAudit : IAudit {
    public string UserName { get; set; }
    public DateTime DateCreated { get; set; }

    public UserAdit(User user) {
        UserName = user.UserName;
    }
}

Nun ein Objekt, das IAuditable (User von oben) ist, möchte ich in der Lage sein, eine Intance von IAudit (UserAdit von oben) durch Einfügen des IAuditable-Objekts in den Konstruktor zu erstellen. Idealerweise hätte ich so etwas wie:

if (myObject is IAuditable) {
    var audit = new IAudit(myObject) { DateCreated = DateTime.UtcNow }; // This would create a UserAudit using the above example
}

Ich habe jedoch einige Probleme:

  • Sie können keine Instanz einer Schnittstelle erstellen
  • Nein, wo im Code definiert, welche IAudit für welche IAuditable gilt.
  • Ich kann nicht angeben, dass die IAudit-Schnittstelle einen Konstruktor haben muss, der eine IAuditable

Ich bin sicher, dass dies ein Designmuster ist, das viele zuvor hatten, aber ich kann mich nicht damit auskennen. Ich würde mich sehr freuen, wenn mir jemand zeigen könnte, wie dies erreicht werden kann.

15
nfplee

No wo im Code definiert, welche IAudit für welche .__ gilt. IAuditable Ich kann nicht angeben, dass die IAudit-Schnittstelle eine .__ haben muss. Konstruktor, der ein IAuditable nimmt

Sie können diese beiden Probleme beheben, indem Sie Ihrer IAuditable eine CreateAudit()-Funktion hinzufügen. Dann erhalten Sie eine IAudit, die aus der IAuditable erstellt wurde. Als Bonus, wenn Sie einen Verweis auf die IAudit in der IAuditable (oder umgekehrt) speichern möchten, damit Sie sie miteinander in Beziehung setzen können, ist es ziemlich einfach, dass eine implementierende Klasse das tut. Sie können auch GetAuditable() zu IAudit hinzufügen, um beispielsweise die IAuditable zu erhalten, aus der sie erstellt wurde.

Eine einfache Implementierung würde folgendermaßen aussehen (in einer Klasse, die IAuditable implementiert):

public IAudit CreateAudit()
{
    UserAudit u = new UserAudit(UserName);
    return u;
}
15
Tridus

Sie können keine Instanz einer Schnittstelle erstellen

Richtig. Sie erstellen eine Instanz eines Objekts implementierend einer Schnittstelle:

IAuditable myUser = new User();

Nein, wo im Code definiert, welche IAudit für welche IAuditable gilt

Sie können dies nicht direkt mit einer einzigen Schnittstelle durchführen. Sie müssen Ihr Design überdenken.

Sie können einen offenen generischen Typ in der Schnittstelle verwenden und ihn mit geschlossenen Typen implementieren:

public interface IAudit<T> {
    DateTime DateCreated { get; set; }
}

public class UserAudit : IAudit<User> {
    public string UserName { get; set; }
    public DateTime DateCreated { get; set; }

    public UserAdit(User user) {
        UserName = user.UserName;
    }
}

Ich kann nicht angeben, dass die IAudit-Schnittstelle über einen Konstruktor verfügen muss, der IAuditable akzeptiert

Richtig, das geht nicht. Siehe hier . Sie müssen einen solchen Konstruktor auf den Implementern erstellen.

14
Oded

Eine Möglichkeit wäre die Verwendung von Generika.

Sobald Sie einen T-Typ haben, der die I-Schnittstelle implementiert und über einen öffentlichen, parameterlosen Konstruktor verfügt, können Sie eine Instanz von T erstellen:

public void Create<T> where T : IAudit, new()
{
     T instance = new T();
     // TODO: Your logic using such T instance of IAudit implementation
} 

Ich kenne Ihre Code-Architektur oder Ihr Ziel nicht, aber Sie können eine Factory-Methode wie oben erstellen, um Instanzen von IAudit-Objekten zu erstellen.

4

Natürlich können Sie keine Instanz einer Schnittstelle erstellen, aber wenn Sie wirklich versucht haben, eine Instanz der übergebenen Klasse zu erstellen, können Sie Folgendes tun:

IAuditable j = ((IAuditable)Activator.CreateInstance(myObject.GetType()));

Sie müssen wissen, welche konkrete Klasse Sie erstellen möchten. In Ihrem Beispiel ist myObject die einzige Option. 

Alternativ können Sie nach etwas suchen, das als "Abhängigkeitsinjektion" bezeichnet wird, mit der Sie angeben können, welche Art von konkreter Klasse in Parameter eingefügt werden soll, die Schnittstellen in Konstruktoren oder in Feldern angeben. Ich bin mir nicht sicher, was Ihr Gesamtdesign ist, daher könnte dies zutreffend sein. In Dependancy Injection können Sie in Ihrem Code angeben, dass IAuditables mit UserAudit erstellt werden sollte, obwohl es etwas mehr Verbindungen gibt, als einfach "new IAuditable" aufzurufen.

4
deepee1

Wenn Sie eine Instanz für eine Schnittstelle erstellen müssen, können Sie eine öffentliche Klasse mit dem Namen FactoryClass () erstellen, die alle Interfaces-Methoden enthält. Sie können den folgenden Code verwenden:

public class FactoryClass  //FactoryClass with Interface named "IINterface2"
{
   public IInterface2 sample_display()   //sample_display() is a instance method for Interface
   {
       IInterface2 inter_object = null;   //assigning NULL for the interface object
       inter_object = new Class1();       //initialising the interface object to the class1()
       return inter_object;   //returning the interface object
   }
}

Fügen Sie in der Klasse Main () den folgenden Code hinzu:

IInterface2 newinter; //creating object for interface in class main()
FactoryClass factoryobj=new FactoryClass();  // creating object for factoryclass

Fügen Sie im Konstruktor Folgendes hinzu:

newinter=factoryobj.sample_display() // initialisingg the interface object with the instance method of factoryobj of FACTORY CLASS.

sie können die Funktion mithilfe des folgenden Codes aufrufen:

newinter.display() //display() is the method in the interface.
0
Elango

Sie können eine statische Schnittstellenvariable außerhalb des Bereichs erstellen und diese dann im Code verwenden.

static IRequestValidator ir;


static void Main(string[] args)...
0
user890332

Wir können keine Instanz einer Schnittstelle erstellen .Interface kann Speicheradressen enthalten, die diese Schnittstelle erben oder implementieren .__

interface IInterface
{
    void GetData();
}
public class SomeClass : IInterface
{
    public void GetData()
    {
        //do something
    }
}
class Program
    {
        static void Main(string[] args)
        {
        IInterface Iface = new SomeClass();
        Iface.GetData();
         ReadLine();
        }
    }
0