2017-12-26 14 views
-5

ここでは、子クラスのインスタンスと親クラスの参照変数から親クラスメソッドを呼び出すことができます。親の参照変数から子クラスのメソッドを呼び出すことができない理由

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

あなたは相続の反対の意味を持っているからです。 BがAであるという事実は、AがBであることを意味するものではありません –

+0

[ツアー]を取って、あなたが得た回答に関してSOがどのように働くのか見てください。 – Plutonix

+3

'obj'は' A'への参照です。 'A'のインスタンスを' A'のサブクラスのインスタンスに割り当てることができます。したがって、それが参照するオブジェクトは、それから離れたタイプのB型であることを保証するものではありません。したがって、参照するオブジェクトの 'A'メンバのみを参照することができます。*これは、' A obj'の前の 'A'が*を意味します。それは、「私はこのことが「A」、それ以上ではないことを約束する」という意味です。多分それは 'B'です、おそらく' C 'と呼ばれる 'A'の他のサブクラスがあります - これは上記のいずれかである可能性があります。参照の種類は、何らかの「A」であることのみを保証しています。 –

答えて

0

継承は、C#の基本的なビルディングブロックです。パラダイムは、特にインタフェースを使用して多形性の形で理解しやすくなります。 C#では、複数のクラスから継承することはできませんが、複数のインターフェイスを継承できます。我々は、次を構築する概念を理解することが

public interface IColor 
{ 
    void WriteColor(); 
} 

上記は、それが意図の宣言として機能し、任意のロジックを実装していません。だから、私たちは今クラスを書くつもりです。あなたが実装する場合

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

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

、あなたは、長方形や円オブジェクトを作成するとき、あなたはメソッド WriteColorを呼び出すことができます。しかし、あなたは同じメソッド名を持っていますが、それらは異なっています。これはポリモーフィズムによるもので、インターフェイスでロジックを分離することができます。したがって、2つの完全に別々の実装があります。

他のフォームは、直接継承する方法に基づいて異なる用語を作成するクラスを介していますが、

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

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

    public string Color { get; } = color; 
} 

ここでは、例を拡大するために、Shapeオブジェクトを作成します。

// 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; 
} 

あなたは、この場合には、基本クラスオブジェクト形状を呼び出す場合は、形状を通過するので、だから、色が必要ですと色。さらにこれを拡張するために、次のオブジェクトを作成します。

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

だから何ですか? BuildShapeは、シェイプとシェイプの色からプロパティにアクセスできます。なぜですか?さて、シェイプの色は基本クラスとして定義されます。つまり、シェイプの色は色に依存します。私たちが形状から継承すると、型の型が公開されます。これは、次の理由によるものです。

  • シェイプの色、私たちのベースまたはスーパークラス。
  • シェイプカラーのサブクラスをシェイプしますが、ビルドシェイプの直接スーパークラスです。

上記は私たちの継承の順番です。あなたが混乱している場合、我々は説明することによって簡素化することができます:

  • 基本クラスをベースキーワードは、派生クラス

  • サブクラス&スーパークラス内から基底クラスのアクセスメンバーに使用されます。クラス宣言内のオプションのextends節は、現在のクラスの直接スーパークラスを指定します。クラスは、それが継承するクラスの直接のサブクラスと言われています。直接スーパークラスは、現在のクラスの実装が導出されるクラスです。

トピックhereについて詳しく読むことができます。

関連する問題