나를 위해 여러 클래스를 생성하는 라이브러리를 사용하고 있습니다.baseclass 객체에서 하위 클래스 메서드를 호출하려면 어떻게해야합니까?
이러한 클래스는 모두 공통 기본 클래스에서 상속되지만 기본 클래스는 모든 하위 클래스에 공통적 인 몇 가지 메서드를 정의하지 않습니다. 예를 들어
는 :
SubClassA : BaseClass{
void Add(ItemA item) {...}
ItemA CreateNewItem() {...}
}
SubClassB: BaseClass{
void Add(ItemB item) {...}
ItemB CreateNewItem() {...}
}
불행하게도, 기본 클래스 이러한 방법이 없습니다. 이것은 좋은 것 :
BaseClass{
// these aren't actually here, I'm just showing what's missing:
abstract void Add(ItemBaseClass item); // not present!
abstract ItemBaseClass CreateNewItem(); // not present!
}
내 A + B 객체에 대한 공통 기본 클래스 및 항목 개체에 대한 공통 기본 클래스가 있기 때문에, 나는 다형성의 멋진 세계의 혜택을 기대했다.
일반적인 메서드는 실제로 기본 클래스에 없기 때문에 사실상 호출 할 수는 없습니다. 예를 들어,이 완벽 할 것 :
BaseClass Obj;
Obj = GetWorkUnit(); // could be SubClassA or SubClassB
ItemBaseClass Item = Obj.CreateNewItem(); // Compile Fail: CreateNewItem() isn't in the base class
Item.DoSomething();
Obj.Add(Item); // Compile Fail: Add(...) isn't in the base class
분명히 작동합니다하지만 내가 혜택을 부정하는 것이다 있던 유형을 알아야 할 것 캐스팅.
어떻게 이러한 메서드를 호출 할 수 있습니까? 나는 전화하려고하는 메서드를 구현하지 않는 개체를 얻는 것에 대해 걱정하지 않습니다.
CType(Obj, Object).Add(Item) // Note: I'm using C#--NOT VB
의 againt, 나는 (I 규칙 밖으로 부분 클래스를 생각한다) 이러한 클래스를 통해 제어 할 수 없습니다 : 나는 인텔리을하지 않지만 컴파일러의 행복하고 그것을 작동합니다 - 사실은 VB에서 내가 원하는 것을 할 수 있습니다 .
그럼 방법 자체에 문제가 있습니까? Option Strict가 설정된 경우에만 광산을 사용하십시오 –
하위 클래스를 제어 할 수 있습니까? 그럴 경우 Lucero의 솔루션으로 이동하십시오. –
@Michael Haren : C#에는 Option Strict가 전혀 없습니다. 내 솔루션은 당신이 클래스를 제어 할 수 없다면 작동합니다. 당신이 서브 클래스를 제어한다면 Lucero의 솔루션이 가장 좋습니다. –