그래서 Account에서 파생 된 저축과 수표로 구성된 Account 유형의 배열이 있습니다. 이 메소드를 호출 할 수 있습니까? 컴파일러는 기본 클래스의 메서드를 표시 만하고 파생 클래스의 메서드에 액세스 할 수 없습니다. 벽에 내 머리를 치고.파생 클래스 배열, 메서드 호출?
답변
당신은 파생 클래스에 배열의 요소를 캐스팅해야 인스턴스가 실제로 해당 유형의이다
((Checking)someArray[42]).Whatever();
경우, 이것이 InvalidCastException
발생합니다.
감사합니다. 이전에 캐스팅을 시도했지만 캐스팅 주위에만 바깥 괄호를 넣지 않았습니다. 감사! – Kefkamaydie
캐스팅을 사용할 수 있지만 배열 요소의 정확한 유형을 알지 못하기 때문에 이러한 예외를 처리하고 코드를 처리하는 데 오히려 추한 코드가 발생합니다.
당신은 같은 것을 사용할 수 있습니다 유형을 추측하고 그에 따라 메서드를 호출, 그러나
Saving s = array[i] as Saving;
if(s != null)
{
s.SomeSavingMethod();
}
else
{
Checking c = array[i] as Checking;
if(c != null)
c.SomeCheckingMethod();
}
을, 일반적으로 나쁜 디자인 간주됩니다. 가상 메서드의 경우처럼 들리거나 이러한 배열이 처음에는 같은 배열에 없어야합니다.
저는 학생이고, 교수는 다른 파생 된 객체가 동일한 배열에 배치되도록 요청했습니다. 그런 식으로 끝낸 이유! – Kefkamaydie
찾고있는 기능을 수행 할 수있는 기본적으로 두 가지 방법이 있습니다.
모든 클래스가 구현하는 공용 인터페이스를 선언하는 가장 좋은 방법은 틀림없이 좋습니다.
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();
}
- 1. 파생 클래스 호출 메서드
- 2. 파생 클래스의 호출 메서드
- 3. 파생 클래스 가상 메서드로 기본 클래스 가상 메서드 호출
- 4. 배열 목록의 개체에서 적절한 메서드 호출
- 5. 기본 클래스의 객체에 대한 파생 클래스 호출 메서드
- 6. 클래스 메서드 내에서 클래스 메서드 내에서 같은 함수 호출 호출
- 7. 호출 정적 클래스 메서드
- 8. 호출 클래스 마무리 메서드
- 9. 기본 클래스의 일반 메서드 포인터를 사용하여 파생 클래스의 메서드 호출
- 10. 클래스 메서드 호출을 동적으로 호출
- 11. C++/CLI에서 래퍼 (파생 관리 클래스)를 통해 파생 된 기본 클래스의 재정의 된 메서드 호출
- 12. 기본 클래스에서 기본 클래스 메서드 호출
- 13. 배열 (Matlab)의 모든 클래스 인스턴스에 대한 호출 메서드
- 14. C# 클래스 포함 메서드 호출
- 15. 확장 클래스 메서드 호출 문제
- 16. C++ 상위 클래스 메서드 호출
- 17. Ajax 호출 메서드 (클래스 PHP에서)
- 18. JSON에서 C# 클래스 메서드 호출
- 19. Python에서 다른 클래스 메서드 호출
- 20. C++ - 클래스 템플릿에서 메서드 호출
- 21. 클래스 매개 변수에서 클래스 메서드 호출
- 22. 해당 클래스 내에서 클래스 메서드 호출
- 23. 오버라이드 된 메서드 호출, 오버라이드 된 메서드 호출 수퍼 클래스
- 24. AS3 : 정적 클래스 메서드 호출 - 클래스 및 메서드 이름은 문자열입니다
- 25. 기본 클래스 C++에서 상호 교환 가능한 파생 클래스 메서드
- 26. 기본 벡터 요소에 파생 된 메서드 호출 (예제)
- 27. 다른 메서드 호출 제한 메서드
- 28. 가상 구현에서 파생 된 형식에 대한 정적 메서드 호출? (안드로이드)
- 29. 파생 클래스
- 30. 파생 클래스
더 자세히 설명해 주시겠습니까? '저축'과 '확인'중 어떤 항목인지 이미 알고 있습니까? 각 유형에서 다르게 구현되는 가상 메소드를 사용할 수 없습니까? – svick
계정이 다르거 나 코드에서 그 차이를 사용해야한다면 (예 :'Checking' 유형의 요소를'Savings' 유형의 요소와 다르게 사용) 동일한 배열에 넣지 마십시오. – dasblinkenlight