У меня возникла проблема с генериками и новыми участниками. Я написал общий класс, который работает с объектом типа ObjectA. ObjectB происходит от ObjectA и скрывает несколько членов ObjectA. Когда я предоставляю тип ObjectB в качестве параметра типа для универсального класса, я ожидаю, что когда я вызову любой из членов, скрытых ObjectB, я буду вызывать реализацию ObjectB. Однако CLR по-прежнему вызывает скрытые элементы (реализация ObjectA). Это кажется нелогичным, потому что я явно предоставил тип ObjectB универсальному классу. Это проблема с самими дженериками или я что-то не так делаю?
Редактировать: К сожалению, у меня нет доступа к исходному коду ObjectA, и элемент, который я хочу переопределить, не является виртуальным. Если бы у меня был доступ к исходному коду ObjectA, я бы сделал член виртуальным, но, поскольку я не могу этого сделать, мой единственный вариант «переопределения» члена - через ключевое слово «new».
</p>
<pre><code>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);
}