Хорошо, две альтернативы, но прежде чем я начну, вы должны знать это:
public abstract class GatewayBase { ... }
public class Gateway : GatewayBase { ... }
Альтернатива # 1
public abstract class ModelBase
{
public GatewayBase GatewayBase { get; private set; } // property named GatewayBase
public ModelBase(GatewayBase gateway)
{
GatewayBase = gateway;
}
}
public class Model : ModelBase
{
public Gateway Gateway { get; private set; } // property named Gateway
public Model(Gateway gateway)
: base(gateway)
{
Gateway = gateway;
}
}
Альтернатива # 2
public abstract class ModelBase
{
public GatewayBase Gateway { get; private set; } // property named Gateway
public ModelBase(GatewayBase gateway)
{
Gateway = gateway;
}
}
public class Model : ModelBase
{
public new Gateway Gateway { get; private set; } // property named Gateway plus "new" modifier
public Model(Gateway gateway)
: base(gateway)
{
Gateway = gateway;
}
}
Обсуждение:
С Альтернативой # 1 конкретный класс Model
может "видеть" две версии Gateway
. Один называется GatewayBase
, а другой - просто Gateway
, но оба они содержат один и тот же экземпляр. С Альтернативой № 2, технически, все еще есть две версии Gateway
, но одна скрывает другую, так что фактически есть только одна (если вы не обойдете ее, используя base.Gateway
). Мне нравится, что Альтернатива №2 позволяет мне вызывать свойство Gateway
, где бы я ни находился, потому что оно часто используется как в базовых, так и в конкретных классах, и это короткое, но ясное имя. Тем не менее, у меня есть некоторые сомнения по поводу использования модификатора new
таким образом. Это действительно законный сценарий для сокрытия собственности?
Что бы вы выбрали и почему?
Или не стесняйтесь предлагать другие альтернативы.
Спасибо.
EDIT:
Следует отметить, что GatewayBase
и ModelBase
находятся в зависимой сборке, поэтому они ничего не знают о Gateway
и Model
. Однако, Gateway
и Model
, конечно, знают о GatewayBase
и ModelBase
.