public class BaseClass
{
public virtual void Display()
{
Console.WriteLine("I am Base Class");
}
public void BaseClassMethod()
{
Console.WriteLine("I am Base Class Method");
}
}
public class DerivedClass : BaseClass
{
public override void Display()
{
Console.WriteLine("I am Derived Class");
}
public void DerivedClassMethod()
{
Console.WriteLine("I am Derived Class Method");
}
}
class Program
{
static void Main(string[] args)
{
BaseClass bc = new BaseClass();
bc.Display();
bc.BaseClassMethod();
Console.WriteLine("--------------");
DerivedClass dc = new DerivedClass();
dc.Display();
dc.BaseClassMethod();
dc.DerivedClassMethod();
Console.WriteLine("--------------");
BaseClass bc2 = new DerivedClass();
bc2.Display();
bc2.BaseClassMethod();
//bc2.DerivedClass(); --> I can't reach b2.DerivedClass() method
Console.ReadLine();
}
}
모두 안녕하세요. 나는 왜 그리고 왜 내가 기본 클래스 참조에서 파생 클래스 객체를 만들고 사용하고자하는지에 대해 내 마음을 깨끗이하려고 노력하고있다. 나는 가상이 어떻게 작동 하는지를 안다. 파생 클래스가 기본 클래스이며 가상 메서드를 재정의 할 수 있음을 알고 있습니다. 나는 기본 클래스에서 비 가상 메소드에 접근 할 수있다. 그러나 나는 왜이 스타일의 객체 생성을 사용할 수 있는지 그리고 왜 그럴 수 있는지 알고 싶습니다. 예제 코드의 마지막 부분 에서처럼;기본 클래스 참조로 객체를 생성해야하는 이유는 무엇입니까?
BaseClass bc2 = new DerivedClass();
파생 클래스 메서드를 사용할 수 없어 파생 클래스 메서드를 사용할 수 없습니다. 그러나 새로운 DerivedClass 때문에 여전히 파생 클래스입니다. 정상적인 DerivedClass를 사용한다면 d = new DerivedClass(); 스타일, 나는 두 클래스 방법을 모두 사용할 수 있습니다. 나는이 스타일을 사용하고자하는 이유와 상황을 찾을 수 없다. 누구든지 나를 보여 주면 기쁠 것입니다.이 스타일이 언어로 존재한다는 것을 이해할 수 있도록 기본 클래스 참조에서 파생 클래스 객체를 사용해야하는 상황입니다. 나는 왜 이것이 작동하지 않는지 또는 그런 식으로 물어 보는 것이 아니라는 것을 알고 싶습니다. 상황을 알고 싶습니다. 고맙습니다.
내가 원, 사각형, 및 보유 할 수있는 목록을 가지고 조금 귀하의 예를
public class Shape
{
public virtual void Display()
{
Console.WriteLine("I am a Shape");
}
public void BaseClassMethod()
{
Console.WriteLine("I am Base Class Method");
}
}
public class Square : Shape
{
public override void Display()
{
Console.WriteLine("I am Square");
}
public void DerivedClassMethod()
{
Console.WriteLine("I am Derived Class Method");
}
}
public class Circle : Shape
{
public override void Display()
{
Console.WriteLine("I am Circle");
}
}
class Program
{
static void Main(string[] args)
{
List<Shape> shapes = new List<Shape();
shapes.Add(new Square());
shapes.Add(new Circle());
을 변경할 수 있습니다 여러 유형의
1) 컬렉션 :
'클래스 상속'에 대한 읽기/연구를 수행하셨습니까? 아마도 당신은'OOP'에서'C# MSDN 구글 검색'을 할 수있을 것입니다. 누가 어떻게, 왜, 어떻게 그리고 왜 – MethodMan
, 여러분이 오직 하나의 기본 클래스와 그것으로부터 파생 된 클래스 하나를 가질 때, 당신은 가지 않을 것입니다. 많은 가치를 찾는다. 공통된 기능을 가진 여러 클래스가 있지만 상속의 이점을 얻을 수있는 구현 경로가 다를 때입니다. – Jonesopolis
요약 : 기본 클래스 기능 세트가 제공해야하는 것보다 더 많은 용도로 사용되지 않을 것이라고 독자에게 알립니다. 파생 된 타입을 선언하는 것은 "논리적 잡음"입니다. 그것은 필요한 것 이상으로 복잡한 것을 만들지 않는 것입니다. 작업에 적합한 도구를 사용하십시오. –