2012-10-05 7 views
0

이것이 C#에서 허용되는지 확실하지 않지만 다른 언어로 이전에 해왔습니다.배열의 하위 클래스에서 올바른 메서드를 호출하려면 어떻게해야합니까?

어린이가있는 Parent 클래스를 가지고 있다고 가정 해 봅시다. Child0Child1입니다. 배열 타입은 Parent이고, Array[0] 타입은 Child0이고 Array[1] 타입은 Child1입니다. 이 시나리오에서는 어떻게 어린이 메소드를 호출합니까? Array[0].Method()을 입력하면 Parent 버전의 메서드가 호출됩니다. 방법의 Child0 버전을 호출하려면 어떻게해야합니까? 이것이 가능한가? heriting 클래스에

public class Parent{ 
    public virtual void Method(){ 
    ... 
    } 
} 

과를 오버라이드 (override) :

+1

이 가진 인쇄한다 당신은'virtual'과'override' 키를 시도했습니다. 말? 너 뭐 해봤 니? 문제의 원인을 알 수 있도록 수업 코드를 보여줍니다. – zimdanen

+0

개체를 부모로 만들면 부모에있는 속성/메서드에만 액세스 할 수 있습니다. 자식 메서드를 호출하려면 자식으로 개체를 만들어야합니다. – landoncz

+0

몇 가지 코드를 게시 할 수 있습니까? –

답변

2

당신은 기본 클래스에서 가상으로 방법을 선언해야

public class Child : Parent{ 
    public override void Method(){ 
     ... 
    } 
} 

주 당신이 경우에 정말 필요가 있다는 " 모든 상속 클래스에 자신의 버전이 있으므로 Parent 클래스의 "표준"구현을 사용하면 추상으로 메소드를 설정할 수도 있습니다.

public class Parent{ 
    abstract public void Method(); 
} 

그런 다음 선택 사항이 없으며 Parent를 상속 한 모든 클래스가 Method 구현을 제공해야합니다. 그렇지 않으면 컴파일 시간 오류가 발생합니다.

1

부모 메서드를 만들 경우 virtual 자식 클래스의 기본 메서드를 재정의 할 수 있습니다.

public class Human 
{  
    // Virtual method 
    public virtual void Say() 
    { 
     Console.WriteLine("i am a human"); 
    } 
} 

public class Male: Human 
{   
    // Override the virtual method 
    public override void Say() 
    { 
     Console.WriteLine("i am a male"); 
     base.Draw(); // --> This will access the Say() method from the 
     //parent class.   
    } 
} 

하는 배열에 추가 : 결과를

Human[] x = new Human[2]; 
x[0] = new Human(); 
x[1] = new Male(); 

인쇄 출력 (내가 개인적으로 List<T>을 사용 altho) :

foreach (var i in x) 
{ 
    i.Say(); 
} 

"i am a human" // --> (parent class implementation)  
"i am a male" // --> (child class implementation) 
관련 문제