2012-09-11 3 views
2

그래서 Account에서 파생 된 저축과 수표로 구성된 Account 유형의 배열이 있습니다. 이 메소드를 호출 할 수 있습니까? 컴파일러는 기본 클래스의 메서드를 표시 만하고 파생 클래스의 메서드에 액세스 할 수 없습니다. 벽에 내 머리를 치고.파생 클래스 배열, 메서드 호출?

+3

더 자세히 설명해 주시겠습니까? '저축'과 '확인'중 어떤 항목인지 이미 알고 있습니까? 각 유형에서 다르게 구현되는 가상 메소드를 사용할 수 없습니까? – svick

+1

계정이 다르거 나 코드에서 그 차이를 사용해야한다면 (예 :'Checking' 유형의 요소를'Savings' 유형의 요소와 다르게 사용) 동일한 배열에 넣지 마십시오. – dasblinkenlight

답변

3

당신은 파생 클래스에 배열의 요소를 캐스팅해야 인스턴스가 실제로 해당 유형의이다

((Checking)someArray[42]).Whatever(); 

경우, 이것이 InvalidCastException 발생합니다.

+0

감사합니다. 이전에 캐스팅을 시도했지만 캐스팅 주위에만 바깥 괄호를 넣지 않았습니다. 감사! – Kefkamaydie

2

캐스팅을 사용할 수 있지만 배열 요소의 정확한 유형을 알지 못하기 때문에 이러한 예외를 처리하고 코드를 처리하는 데 오히려 추한 코드가 발생합니다.

당신은 같은 것을 사용할 수 있습니다 유형을 추측하고 그에 따라 메서드를 호출, 그러나

Saving s = array[i] as Saving; 
if(s != null) 
{ 
    s.SomeSavingMethod(); 
} 
else 
{ 
    Checking c = array[i] as Checking; 
    if(c != null) 
     c.SomeCheckingMethod(); 
} 

을, 일반적으로 나쁜 디자인 간주됩니다. 가상 메서드의 경우처럼 들리거나 이러한 배열이 처음에는 같은 배열에 없어야합니다.

+0

저는 학생이고, 교수는 다른 파생 된 객체가 동일한 배열에 배치되도록 요청했습니다. 그런 식으로 끝낸 이유! – Kefkamaydie

0

찾고있는 기능을 수행 할 수있는 기본적으로 두 가지 방법이 있습니다.

모든 클래스가 구현하는 공용 인터페이스를 선언하는 가장 좋은 방법은 틀림없이 좋습니다.

public interface IWorker 
{ 
    void DoWork(); 
} 

public class A : IWorker 
{ 
    public void DoWork() 
    { 
     // TODO: Implement this method 
     throw new NotImplementedException(); 
    } 
} 

public class B : IWorker 
{ 
    public void DoWork() 
    { 
     // TODO: Implement this method 
     throw new NotImplementedException(); 
    } 
} 

두 번째는 유형을 감지하고 지원하는 경우 메소드를 호출합니다. 이 줄을 따라. 캐스트가 성공하면 null이 아닌 값만 반환하기 때문에 AS operator은 매우 편리합니다.

List<object> workers = new List<object>() { new A(), new B() }; 
foreach (object itm in workers) 
{ 
    ClassThatSupportsDoWork obj = itm as ClassThatSupportsDoWork; 
    if (obj != null) 
     obj.DoWork(); 
} 
관련 문제