У меня есть следующие классы
class GridBase
{
public object DataSource { get; set; }
}
class GenericGrid<T> : GridBase
{
public new T DataSource { get; set; }
}
Могут быть созданы экземпляры классов GridBase и Generic Grid, а также может происходить любой из них.
Считается ли это правильным / приемлемым способомреализовать такую иерархию?Или вы должны пройти лишнюю милю и реализовать ее следующим образом
class GridBase
{
protected object dataSource;
public object DataSource { get { return dataSource; } set { dataSource = value; } }
}
class GenericGrid<T> : GridBase
{
public new T DataSource { get { return (T)dataSource; } set { dataSource = value; } }
}
То же самое относится и к неуниверсальным классам, когда свойство повторно вводится в потомке, я просто использую здесь общий пример.
Другой случай и вопрос
abstract class SomeBase
{
protected abstract void DoSomething();
}
class Child : SomeBase
{
protected override void DoSomething()
{
/* Some implementation here */
}
}
Ситуация здесь такова, что фреймворк "X" объявляет SomeBase, позволяя вам определять своих потомков.Классы, которые они создают (во время выполнения), затем наследуются от вашего класса (в данном случае Child).Однако они не вызывают ваш метод DoSomething () из своей реализации DoSomething ().
Со своей стороны, они также не могут слепо вызывать base.Dosomething (), потому что типичным случаем является то, чтокласс, который они генерируют, обычно происходит от SomeBase, и поскольку метод является абстрактным, он недопустим.(Лично мне не нравится это поведение в C #).
Но в любом случае, это хороший или принятый дизайн, который не вызывает base.xxx (), особенно когда «намерение» противоречит?
РЕДАКТИРОВАТЬ С точки зрения дизайна каркаса.Это нормально / приемлемо, что это делает?Если нет, то как бы он был разработан таким образом, чтобы либо предотвратить такой случай, либо лучше сообщить свое намерение (в обоих случаях).