Ответ 1
Проблема заключается в том, что ваш класс Cars по-прежнему будет иметь интерфейс, который он наследует от List, что может позволить операции, которые вам не нужны.
Недавно я использовал класс, который наследуется от коллекции вместо того, чтобы иметь экземпляр, созданный внутри класса, является ли это приемлемым или создает невидимые проблемы дальше по дороге? Примеры ниже для ясности:
public class Cars : List<aCar>
вместо чего-то вроде:
public class Cars
{
List<aCar> CarList = new List<aCar>();
}
Любые мысли?
Проблема заключается в том, что ваш класс Cars по-прежнему будет иметь интерфейс, который он наследует от List, что может позволить операции, которые вам не нужны.
Это зависит от конечной цели вашего класса. Если он будет работать только как ваша собственная реализация коллекции, используйте наследование. Если нет, включите коллекцию в качестве свойства. Второй вариант более универсален:
Я неправильно прочитал вопрос раньше.
Я бы предложил использовать композицию вместо наследования. Если вы хотите использовать все забавные вещи LINQ, обязательно реализуйте IEnumerable<T>
и, возможно, даже IList<T>
, но я бы не получал непосредственно от List<T>
.
Если вы хотите получить материал коллекции "бесплатно", но все же сохраните контроль, вы можете использовать CollectionBase. Это все еще связывает вас с точки зрения вашего единственного выстрела в наследовании, но по крайней мере вы получаете больше контроля над тем, что происходит в коллекции.
Если вы хотите, чтобы ваш класс Cars действовал так же, как List, и имел те же методы, что и не так уж плохо. Вы просто проистекаете из этого, и все готово. Затем, если вы хотите добавить какие-либо дополнительные функции, вы можете просто объявить эти методы, и все готово. Тем не менее, теперь вы привязаны к списку, и если список изменяется каким-либо нежелательным образом, вы ввернуты.
Если вы сделаете вместо него составной класс и создаете экземпляр List внутри класса, вам нужно только tp разоблачить методы List, которые вы хотите открыть. Но это означает, что вы также должны повторять их.
Если цель класса состоит в том, чтобы добавить дополнительную функциональность к стандартной коллекции, я бы наследовал ее из коллекции. Если коллекция является лишь частью большей картинки, это больше похоже на свойство.
Я бы, однако, рассмотрел использование Collection <T> вместо списка <T> если вам действительно не нужна функциональность в List <T> .
Требуется ли класс "Автомобили"? Имеет некоторые дополнительные функции, чем "Список"? Если нет, вы должны использовать "Список" (или лучше "IList" ).
Если класс "Автомобили" имеет любую добавленную функциональность, есть два основных сценария:
.
public class CarList<T> : List<T> where T : Car {
// some added functionality
}
Если вы хотите быть более гибким в будущем, вы должны использовать композицию:
public class CarList<T> : IList<T> where T : Car {
private IList<T> innerList;
public CarList() { this.innerList = new List<T>(); }
// implementation of IList<T>
// some added functionality
}