все довольно просто:
ваш класс Level
устанавливает тип Range
на Ranges
(не конкретный ARange
или BRange
).
Вы должны работать с дженериками, например:
public abstract class Level<TRange>
where TRange : Ranges
{
private readonly TRange _range;
protected Level(TRange range)
{
this._range = range;
}
public TRange Range
{
get
{
return this._range;
}
}
}
public class ALevel : Level<ARange>
{
public ALevel()
: base (new ARange())
{
}
}
Вы можете взять этот пример еще дальше:
public abstract class Level<TRange>
where TRange : Ranges/*, new()*/ // i'm not sure about the new() ... have no compiler access right now to check!
{
private readonly TRange _range = new TRange();
public TRange Range
{
get
{
return this._range;
}
}
}
public class ALevel : Level<ARange>
{
}
наш, вы можете представить другого участника в ALevel
, например:
public class ALevel : Level
{
public ARange ARange;
}
Вы можете улучшить этот пример, сделав Range
в Level
виртуальным и переопределив Range
(с перенаправлением на бетон ARange
или BRange
) в конкретных уровнях.
это сильно зависит от использования потом ...
если вам нужен общий доступ к свойству Range
как Ranges
, вы должны ввести другой базовый класс (без универсального ограничения), чтобы ввести базовый член, который вы можете переопределить в своем базовом базовом классе. так что вы можете разыграть экземпляр ALevel
до Level
(без базового класса, который вы должны были бы разыграть до Level<TRange>
, который обладает знанием конкретного TRange
) ...