제네릭 및 새 멤버에 문제가 있습니다. ObjectA 유형의 객체에서 작동하는 제네릭 클래스를 작성했습니다. ObjectB는 ObjectA에서 파생되고 ObjectA의 멤버 중 일부를 숨 깁니다. ObjectB 유형을 generic 클래스의 type 매개 변수로 제공하면 ObjectB에 의해 숨겨진 멤버를 호출 할 때 ObjectB의 구현을 호출 할 것으로 예상됩니다. 그러나 CLR은 여전히 숨겨진 멤버 (ObjectA의 구현)를 호출합니다. 이것은 제네릭 클래스에 ObjectB 유형을 명시 적으로 제공했기 때문에 비논리적 인 것처럼 보입니다. 이것은 제네릭 자체에 문제가 있습니까, 아니면 제가 잘못하고 있습니까?Generics : 숨겨진 멤버가 아닌 새 멤버에 액세스
편집 : 불행히도 ObjectA의 소스 코드에 액세스 할 수 없으며 재정의하려는 멤버가 가상이 아닙니다. ObjectA의 소스 코드에 액세스 할 수 있다면 구성원을 가상으로 만들 수 있지만 그렇게 할 수 없기 때문에 멤버를 "재정의"하는 유일한 방법은 "새"키워드를 사용하는 것입니다. 컴파일러에 의해 생성
class GenericClass<T> where T : ObjectA
{
public void DoWork(T item)
{
// When type parameter 'T' is ObjectB, should get ObjectB's implementation
item.Invoke();
}
}
class ObjectA
{
public void Invoke()
{
// A's implementation...
}
}
class ObjectB : ObjectA
{
public new void Invoke()
{
// B's implementation...
}
}
static void Main()
{
GenericClass<ObjectB> genericClass = new GenericClass<ObjectB>();
ObjectB objectB = new ObjectB();
genericClass.DoWork(objectB);
}
답장을 보내 주셔서 감사합니다. 가상/재정의 된 메서드를 사용하지만 System.Windows.Form을 상속하고 가상이 아닌 멤버에 대한 내 자신의 구현을 작성하려고합니다. –
그러면 다음과 같이 액세스 할 수 없습니다. 당신이 "거의 가상으로"만들려고 노력하는 것처럼 들리지만 그렇게 작동하지 않습니다. –
흠. 당신이 C++ 템플릿에 익숙하다면 이것은 다소 비 직관적이라고 나는 동의한다. C#은 템플릿 클래스의 컴파일을 분리하고 그 당시 ObjectA에 대해서만 알고 있습니다. 템플릿이 인스턴스화되면 인스턴스화 된 클래스는 ObjectB에 대한 추가 지식으로 다시 컴파일되지 않습니다. –