2017-12-26 43 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를 호출 할 수 있습니다. 그러나, 당신은 동일한 방법 이름을 가지고 있지만 그것들은 다릅니다. 이것은 다형성을 통해 이루어지며, 인터페이스를 통해 논리를 분리 할 수 ​​있습니다. 따라서 두 가지 완전히 다른 구현이 있습니다.

다른 양식은 직접 클래스를 통해 전달되며, 이는 상속받는 방식에 따라 다른 용어를 만듭니다.

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

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

    public string Color { get; } = color; 
} 
우리는 예를 들어, 모양 객체를 생성합니다 확장

: 당신이 모양을 통과 할 수 있도록 당신이 모양이 경우 기본 클래스는 색상을 필요로 개체를 호출하는 경우, 그래서

// 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은 모양 및 모양 색상에서 Google의 속성에 액세스 할 수 있습니다. 이유가 무엇입니까? 음, 모양 색상은 기본 클래스로 정의됩니다. 즉, 모양이 색상에 따라 달라집니다. 모양에서 상속받을 때 모양의 유형이 노출됩니다. 이는 다음으로 인한 것입니다.

  • Shape 색상, Google Base 또는 Shape의 수퍼 클래스.
  • 모양 모양 색상의 하위 클래스를 형성하지만 빌드 모양의 직접적인 상위 클래스.

위의 내용은 상속 순서를 나타냅니다. 당신이 혼동하는 경우, 우리는 설명하여 단순화 할 수 있습니다 :

  • 자료 클래스 : 기본 키워드가 파생 클래스

  • 하위 클래스 & 슈퍼 클래스 내에서 기본 클래스의 구성원에 액세스하는 데 사용됩니다 : 클래스 선언의 선택적 extend 절은 현재 클래스의 직접 수퍼 클래스를 지정합니다. 클래스는 그것이 확장하는 클래스의 직접적인 하위 클래스라고합니다. 직접 수퍼 클래스는 구현에서 현재 클래스의 구현을 파생시킨 클래스입니다.

자세한 내용은 here을 참조하십시오.

관련 문제