c# interface - implizite vs explizite Schnittstellenimplementierung




vererbung method (4)

Mögliche Duplikate:
C #: Schnittstellen - Implizite und explizite Implementierung

Würde jemand die Unterschiede zwischen diesen beiden Tieren erklären und erklären, wie man sie benutzt? AFAIK, viele pre.2.0-Klassen wurden ohne generische Typen implementiert, wodurch die letztere Version beide Varianten von Schnittstellen implementiert. Ist der einzige Fall, warum man sie benutzen müsste?

Kannst du auch erklären, wie man sie benutzt?

Vielen Dank


Answers

Es gibt noch eine weitere Möglichkeit, die labyrinthische Implementierung selbst zu betrachten: http://blogs.msdn.com/cbrumme/archive/2003/05/03/51381.aspx .

Kurz gesagt, implizite Implementation gibt Ihnen eine Is-A-Typ-Konvertierung, explizite Implementierung ist nicht zugänglich, es sei denn, das Objekt wird explizit in diesen Schnittstellentyp umgewandelt.


Wenn eine Klasse von zwei oder mehr Schnittstellen erbt und wenn die Schnittstellen die gleichen Methodennamen haben, weiß die Klasse nicht, welche Schnittstellenmethode implementiert wird, wenn Sie implizite Schnittstellenimplementierung verwenden. Dies ist eines der Szenarien, in denen Sie explizit eine Schnittstelle implementieren würden.

Implizite Schnittstellenimplementierung

public class MyClass : InterfaceOne, InterfaceTwo
{
    public void InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}

interface InterfaceOne
{
    void InterfaceMethod();
}

interface InterfaceTwo
{
    void InterfaceMethod();
}

Explizite Schnittstellenimplementierung

public class MyClass : InterfaceOne, InterfaceTwo
{
    void InterfaceOne.InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }

    void InterfaceTwo.InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}

interface InterfaceOne
{
    void InterfaceMethod();
}

interface InterfaceTwo
{
    void InterfaceMethod();
}

Der folgende Link hat ein ausgezeichnetes Video, das dieses Konzept erklärt
Explizite Schnittstellenimplementierung


Es gibt einen guten und ziemlich detaillierten Blogeintrag dazu.

Bei impliziter Schnittstellenimplementierung greifen Sie auf die Methoden und Eigenschaften der Schnittstelle zu, als wären sie Teil der Klasse. Bei expliziten Schnittstellenimplementierungen können Sie nur auf sie zugreifen, wenn Sie sie als diese Schnittstelle behandeln.

In Bezug auf die Zeit, in der Sie eine über die andere verwenden würden, müssen Sie manchmal eine explizite Schnittstellenimplementierung verwenden, da Sie entweder eine Eigenschaft / Methode mit der gleichen Signatur wie die Schnittstelle haben oder zwei Schnittstellen mit denselben Signaturen implementieren möchten diese Eigenschaften / Methoden, die übereinstimmen.

Die folgenden Regeln stammen aus dem Brad Abrams Designrichtlinien-Blog .

  • Verwenden Sie keine expliziten Elemente als Sicherheitsgrenze. Sie können von jedem Client aufgerufen werden, der eine Instanz auf die Schnittstelle überträgt.
  • Verwenden Sie explizite Member, um Implementierungsdetails auszublenden
  • Verwenden Sie explizite Member, um Implementierungen privater Schnittstellen zu approximieren.
  • Stellen Sie eine alternative Möglichkeit bereit, auf explizit implementierte Member zuzugreifen, die von Unterklassen überschrieben werden dürfen. Verwenden Sie den gleichen Methodennamen, es sei denn, ein Konflikt würde entstehen.

Es wird auch in den Kommentaren in Brad's Blog erwähnt, dass beim expliziten Implementieren von Werttypen ein Boxing involviert ist. Beachten Sie also die Leistungskosten.


Ich habe gerade getan:

public static bool Implements<I>(this Type source) where I : class
{
  return typeof(I).IsAssignableFrom(source);
}

Ich wünschte, ich hätte sagen können, where I : interface , aber interface ist keine generische Parameter Einschränkung Option. class ist so nah wie es nur geht.

Verwendung:

if(MyType.Implements<IInitializable>())
  MyCollection.Initialize();

Ich habe nur Implements gesagt, weil das intuitiver ist. Ich bekomme immer IsAssignableFrom Flip-Flop.





c# .net interface