2017-12-26 7 views
-5

Hier kann ich Elternklasse Methode aus der Instanz der Kindklasse und Referenzvariable der Elternklasse aufrufen.Warum kann ich Methoden der Kindklasse nicht aus der Referenzvariable der Eltern aufrufen

public class A 
{ 
    public void showA() 
    { 
     Console.WriteLine("showA"); 
    } 
} 
public class B:A 
{ 
    public void showB() 
    { 
     Console.WriteLine("showB"); 
    } 
} 
public class Program 
{ 
    public static void Main(string[] args) 
    { 
     A obj = new B(); 
     obj.showA(); //why I am not able to call obj.showB() 
    } 
} 
+2

Weil Sie die gegenteilige Bedeutung der Vererbung bekommen haben. Die Tatsache, dass B ist A bedeutet nicht, dass A ist B –

+0

Bitte nehmen Sie die [Tour] .zu sehen, wie SO soll in Bezug auf Antworten arbeiten, die Sie erhalten. – Plutonix

+3

'obj' ist eine Bezugnahme auf' A'. Sie können ihm eine beliebige Instanz von 'A' oder eine beliebige andere Unterklasse von 'A' zuweisen. Es kann also nicht garantiert werden, dass das Objekt, auf das es sich bezieht, vom Typ 'B' ist - weit entfernt davon. Daher können Sie nur 'A'-Elemente des Objekts referenzieren, auf das Bezug genommen wird * Dies ist das, was das' A' vor 'A-obj' bedeutet *. Es bedeutet "Ich verspreche, dass dieses Ding ein' A' ist, nicht mehr und nicht weniger ". Vielleicht ist es ein 'B', vielleicht gibt es eine andere Unterklasse von' A' namens 'C' - könnte eine der oben genannten sein. Die Art der Referenz garantiert * nur * dass es eine Art 'A' ist. –

Antwort

0

Vererbung ein grundlegender Baustein für C#. Das Paradigma kann in Form von Polymorphie, insbesondere mit einer Schnittstelle, leichter zu verstehen sein. In C# können Sie nicht von mehreren Klassen erben, aber mehrere Schnittstellen erben.

das Konzept verstehen wir folgendes bauen:

public interface IColor 
{ 
    void WriteColor(); 
} 

Die oben keine Logik nicht implementiert, wirkt es als eine Absichtserklärung. Also werden wir unsere Klassen jetzt schreiben.

public class Rectangle : IColor 
{ 
    public void WriteColor() => Console.WriteLine("Red"); 
} 

public class Circle : IColor 
{ 
    public void WriteColor() => Console.WriteLine("Blue"); 
} 

Wenn Sie implementieren, wenn Sie Ihr Rechteck oder Kreis-Objekt erstellen, können Sie die Methode WriteColor aufrufen. Aber sie sind anders, obwohl Sie den gleichen Methodennamen haben. Dies geschieht durch Polymorphie, Ihre Schnittstelle ermöglicht die Trennung der Logik. Sie haben also zwei völlig getrennte Implementierungen.

Die andere Form ist jedoch direkt durch eine Klasse, die eine andere Terminologie erstellt, je nachdem, wie Sie erben.

// Object: 
public class ShapeColor 
{ 
    private string color; 

    public Color(string color) => this.color = color; 

    public string Color { get; } = color; 
} 

Wir haben eine Form Objekt erstellen wird, um das Beispiel zu erweitern:

// Shape: Object (Sub Class) 
// ShapeColor: Base Object (Base Class) 
public class Shape : ShapeColor 
{ 
    private string shape; 

    public Shape(string shape, string color) : base(color) 
    { 
      this.shape = shape; 
    } 

    public string TypeOfShape { get; } = shape; 
} 

Wenn Sie also eine Form der Basisklasse erfordert, eine Farbe in diesem Fall widerrufen, so dass Sie eine Form passieren würde und eine Farbe. Um dies weiter auszudehnen, werden wir nun unser nächstes Objekt erstellen.

public class BuildShape : Shape 
{ 
    public void BuildRectangle() 
    { 
      var shape = new Shape("Rectangle", "Red"); 
      Console.WriteLine(shape.TypeOfShape); 
      Console.WriteLine(shape.Color); 
    } 
} 

Also was das? BuildShape könnte auf unsere Eigenschaften aus Form und Form Farbe zugreifen, warum? Nun, die Formfarbe ist als eine Basisklasse definiert, was bedeutet, dass unsere Form von der Farbe abhängig ist. Die Art der Form wird so dargestellt, wie wir sie von der Form erben. Dies ist aufgrund der folgenden:

  • Form Farbe, unsere Basis oder Super-Klasse von Shape.
  • Gestalten Sie die Unterklasse der Formfarbe, aber die direkte Superklasse der Build-Form.

Das obige steht für unsere Reihenfolge der Vererbung.

  • Basisklasse:: Wenn Sie verwirrt sind, können wir mit der Erklärung, vereinfachen die Basis Schlüsselwort aus einer abgeleiteten Klasse den Zugriff auf Mitglieder der Basisklasse verwendet wird

  • Sub Klasse & Super-Klasse: Die optionale extends-Klausel in einer Klassendeklaration gibt die direkte Oberklasse der aktuellen Klasse an. Eine Klasse wird als direkte Unterklasse der Klasse bezeichnet, die sie erweitert. Die direkte Oberklasse ist die Klasse, aus deren Implementierung die Implementierung der aktuellen Klasse abgeleitet wird.

Sie können mehr über das Thema here lesen.

Verwandte Themen