Heim  >  Artikel  >  Backend-Entwicklung  >  C#-Entwurfsmuster – Beispielcode-Sharing für abgeleitete Klassen zur Implementierung nicht-virtueller Schnittstellen-Traps

C#-Entwurfsmuster – Beispielcode-Sharing für abgeleitete Klassen zur Implementierung nicht-virtueller Schnittstellen-Traps

黄舟
黄舟Original
2017-03-18 13:23:431373Durchsuche

Verstehen Sie den Unterschied zwischen Schnittstellenmethoden und virtuellen Methoden

Auf den ersten Blick scheint es keinen Unterschied zwischen der Implementierung einer Schnittstelle und dem Überschreiben einer virtuellen Methode zu geben Die virtuelle Methode ist sehr groß! ! !

Abgeleitete Klassen können nicht virtuelle Mitglieder der Schnittstelle nicht überschreiben.

In der Schnittstelle deklarierte Mitgliedsmethoden sind standardmäßig keine virtuellen Methoden. Daher können Abgeleitete Klassen keine Basisklassen überschreiben, die das implementieren Schnittstelle. Nicht-virtuelle Mitglieder .
Sehen Sie sich ein Beispiel an.
Schnittstelle ITest definieren:

    public interface ITest
    {        void Test();
    }

Basisklasse und Ableitungsklasse, die die Schnittstelle implementieren

    public class Base:ITest
    {        public Base()
        {
            Console.WriteLine("This is base constructor");
        }        //实现ITest接口
        public void Test()
        {
            Console.WriteLine("This is in base to ITest implement");
        }
    }    public class Derive :Base,ITest
    {        public Derive()
        {
            Console.WriteLine("This is derived constructor");

        }        //测试Derive类实现了ITest吗??
        public void Test()
        {
            Console.WriteLine("This is in Derive to ITest implement");
        }
    }

Aufruf Objekt Basis und Ableitung:

            Base b = new Base();
            b.Test();

            Base d = new Derive();//将d声明为Base对象
            d.Test();
            Console.ReadLine();

Das Ausgabeergebnis ist:


C#-Entwurfsmuster – Beispielcode-Sharing für abgeleitete Klassen zur Implementierung nicht-virtueller Schnittstellen-Traps

Es ist ersichtlich, dass das durch die Testmethode der Instanzen b und implementierte Verhalten d befindet sich in der Basis Art von! ! ! Dies zeigt, dass Abgeleitete Klassen keine Mitglieder (nicht-virtuelle Methoden) von Basisklassen überschreiben können, die Schnittstellen implementieren

Siehe jedoch den folgenden Aufruf:

            Base b = new Base();
            b.Test();
            Derive d = new Derive(); //将d声明为Derive对象
            d.Test();
            Console.ReadLine();

Ausgabe Das Ergebnis ist:


C#-Entwurfsmuster – Beispielcode-Sharing für abgeleitete Klassen zur Implementierung nicht-virtueller Schnittstellen-Traps

Wenn Sie also möchten, dass ein Objekt, das erbt, die Schnittstellenimplementierungsmethode aufruft, können Sie nur deklarieren Sie es als Ableitungsinstanz. Dies entspricht nicht dem Prinzip, dass Variablen in C# als Basisinstanzen deklariert werden! ! ! Persönlichkeit der abgeleiteten Klassenmethode, Basisklassenmethode in virtuelle Methode umwandeln

Um diese Verwirrung bei der Verwendung zu vermeiden, gilt: Wenn es wahr ist, dass die Implementierungsmethode der abgeleiteten Klasse ein Persönlichkeitsverhalten ist, dann ist die Implementierung von Die Basisklasse muss den virtuellen Modifikator vor der Schnittstellenmethode hinzufügen!

Der Code wird wie folgt geändert:


Eine Implementierung, mehrere zugehörige Objekte werden verwendet

public class Base:ITest
    {        public Base()
        {
            Console.WriteLine("This is base constructor");
        }        public virtual void Test() //实现ITest接口的虚方法
        {
            Console.WriteLine("This is in base to ITest implemnt");
        }
    }    public class Derive :Base,ITest
    {        public Derive()
        {
            Console.WriteLine("This is derived constructor");

        }         public override void Test() //实现接口ITest的复写方法
        {
            Console.WriteLine("This is in Derive to ITest implemnt");
        }
    }
Bei der Beobachtung des obigen Codes haben wir festgestellt, dass die Schnittstelle in der Basisklasse implementiert ist, wenn die abgeleitete Klasse auch Wenn Sie diese Schnittstelle implementieren möchten, erbt sie standardmäßig die Schnittstellenimplementierung der Basisklasse, sodass Sie nicht wiederholt Code schreiben müssen, um die Schnittstelle zu implementieren.

Zusammenfassung:

1. Die Ableitung kann nicht virtuelle Mitglieder der Schnittstelle überschreiben.
   public interface ITest
    {        void Test();
    }    public class Base:ITest
    {        public Base()
        {
            Console.WriteLine("This is base constructor");
        }        public void Test()
        {
            Console.WriteLine("This is in base to ITest implemnt");
        }
    }    public class Derive :Base,ITest
    {        public Derive()
        {
            Console.WriteLine("This is derived constructor");

        }
    }
2 Wenn es sich bei der abgeleiteten Klassenmethode um eine personalisierte Methode handelt, konvertieren Sie die Basisklassenmethode Methode;

3. Wenn die Basisklasse die Schnittstellenmethode implementiert, erbt die abgeleitete Klasse diese Schnittstelle auch explizit, es besteht jedoch keine Notwendigkeit, sie erneut zu implementieren! ! !

Das obige ist der detaillierte Inhalt vonC#-Entwurfsmuster – Beispielcode-Sharing für abgeleitete Klassen zur Implementierung nicht-virtueller Schnittstellen-Traps. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn