Что ж, C # не позволяет ковариантные типы возвращаемых значений, как вы нашли ... но вы можете использовать обобщения:
public abstract class BaseObject<T> where T : BaseObject<T>
{
public abstract T Clone();
}
public class DerivedObject : BaseObject<DerivedObject>
{
public override DerivedObject Clone()
{
// ...
}
}
Это решение может причинять боль разными способами - не в последнюю очередь потому, что его трудно понять - но оно может работать достаточно хорошо во многих ситуациях.
РЕДАКТИРОВАТЬ: причина, по которой я включил ограничение на T, заключается в том, что BaseObject
может вызывать "свои" методы в экземплярах T
, что обычно очень удобно. Если вам это не нужно, вы можете потерять ограничение.