Можно ли переопределить общие ограничения для реализации абстрактных методов?
Позвольте мне объяснить ... обычно я хотел бы сделать что-то вроде:
public abstract class A
{
public abstract class IData {}
public abstract void DoSomething(IData data);
}
public class B : A
{
public DataB : IData
{
public int ciao;
}
public override void DoSomething(IData data)
{
DataB d = data as DataB;
if (d == null)
{
// print error or whatever...
return;
}
int miao = d.ciao * 2;
// do whatever with miao or d.ciao...
}
}
public class C : A
{
public DataC : IData
{
public float arrivederci;
}
public override void DoSomething(IData data)
{
DataC d = data as DataC;
if (d == null)
{
// print error or whatever...
return;
}
int bau = d.arrivederci * 2f;
// do whatever with bau or d.arrivederci...
}
}
Что мне не нравится, так это что я могу передать функции DoSomething
недопустимый тип параметра.
Я хотел бы иметь возможность сделать что-то вроде
public class B : A
{
public DataB : IData
{
public int ciao;
}
public override void DoSomething(DataB data)
{
int miao = d.ciao * 2;
// do whatever with miao or d.ciao...
}
}
public class C : A
{
public DataC : IData
{
public float arrivederci;
}
public override void DoSomething(DataC data)
{
int bau = d.arrivederci * 2f;
// do whatever with bau or d.arrivederci...
}
}
, что, конечно, невозможно.
По этой причине я закончил тем, что сделал что-то вроде:
public abstract class A
{
public abstract class IData {}
public abstract void DoSomething<T>(T data) where T : IData;
}
Следующим шагом было бы сделать что-то вроде
public class B : A
{
public DataB : IData
{
public int ciao;
}
public override void DoSomething<T>(T data) where T : DataB
{
int miao = d.ciao * 2;
// do whatever with miao or d.ciao...
}
}
public class C : A
{
public DataC : IData
{
public float arrivederci;
}
public override void DoSomething<T>(T data) where T : DataC
{
int bau = d.arrivederci * 2f;
// do whatever with bau or d.arrivederci...
}
}
Так что, по сути, переопределите generi c ограничение, которое я установил в абстрактном методе родителя c. Есть ли способ достичь этого?
Обратите внимание: я не хочу создавать обобщенный c класс, а только метод обобщенного c, который может получить правильный тип данных для каждого различная реализация базового класса.