2008-09-29 7 views
5

Другими словами, это правильно использовать:Правильно ли использовать наследование вместо сглаживания имени в C#?

public class CustomerList : System.Collections.Generic.List<Customer> 
{ 
    /// supposed to be empty 
} 

вместо:

using CustomerList = System.Collections.Generic.List<Customer> 

Я бы лучше использовать первый подход, потому что я бы просто определить CustomerList один раз, и каждый раз, когда я нужен список клиентов, я всегда использовал бы тот же тип. С другой стороны, использование подхода с псевдонимом имен не только заставляет меня переопределять его повсюду, но и каждый другой псевдоним может быть предоставлен каждый раз, когда кто-то хочет его использовать (подумайте о большой команде), и, следовательно, быть менее читаемым.

Обратите внимание, что намерение в этом случае никогда не будет расширять класс, просто для создания псевдонима.

ответ

6

Не делайте этого. Когда люди читают:

List<Customer> 

они сразу же это понимают. Когда они читают:

CustomerList 

они должны пойти и выяснить, что CustomerList есть, и что делает ваш код труднее читать. Если вы не единственный, кто работает над вашей кодовой базой, писать удобочитаемый код - хорошая идея.

11

ну, если вы не добавляете некоторые функциональные возможности в базовый класс, нет смысла создавать объект-оболочку. Я бы пошел с номером два, если вам действительно нужно, но почему бы просто не создать переменную?

List<Customer> customerList = new List<Customer>(); 
+0

Я согласен с «просто использовать переменную», но не думаю, что вам следует защищать использование псевдонима таким образом, который @Trap хочет использовать. – 2008-09-29 09:25:45

+0

Это правда, я бы этого не сделал, но я не был точно уверен, почему ему нужно будет сделать это в первую очередь, и это был вопрос. – 2008-09-30 00:02:37

1

Это один из вопросов «Это зависит».

Если вам нужен новый класс, который ведет себя как список клиентов в дополнение к вашим другим требованиям, тогда наследование является способом.

Если вы просто хотите использовать список клиентов, то используйте переменную.

1

Если вы просто пытаетесь сохранить при вводе текста, используйте последний. Таким образом, вы не столкнетесь с какими-либо причудливыми проблемами наследования.

Если вы действительно хотите открыть логически различный тип коллекции, используйте первый - вы можете вернуться и добавить к нему материал.

Лично я бы просто использовал List<Customer> и назову его днем.

1

Я по существу согласен с Эд. Если вам не нужно на самом деле расширить функциональные возможности родовой конструкции списка, просто использовать общий список:

List<Customer> customerList = new List<Customer>(); 

Если вам необходимо расширить функциональные возможности, то, как правило, вы будете смотреть на наследовании.

Третья возможность - это то, где вам нужно существенно изменить функциональность из общей конструкции списка, и в этом случае вы можете просто наследовать от IEnumerable. Это делает класс пригодным для использования в перечислимых операциях (например, «foreach»), но позволяет полностью определить все поведение класса.

1

Сохранение одного программиста при вводе текста может быть хорошим кошмаром для следующего программиста. Я бы сказал, просто введите родовое правильно, как многие из них сказали. Это более чистое и более точное описание намерений вашего кода, и это поможет программисту по обслуживанию. (Кто может быть вам, шесть месяцев и четыре новых проекта в будущем!)

3

На самом деле вы также не должны использовать. correct approach according to the framework design guidelines is to either use or inherit from System.Collections.ObjectModel.Collection<T> в публичных API (список <T> должен использоваться только для внутренней реализации).

Но в отношении конкретного вопроса именования, рекомендация, как представляется, использовать имя общего типа напрямую без наложения спектров, если вам не нужно, чтобы добавить функциональность к коллекции:

ли вернуть коллекции <T> от объекта моделей для обеспечения стандартной простой API ванильной коллекции API.

ли возвращать подкласс Collection <T> от объектных моделей для обеспечения сбора API высокого уровня.

4

Я согласен с не с использованием псевдонима таким образом. Никто в вашей команде не должен использовать псевдонимы в представленном порядке; это не причина, на которой была предоставлена ​​справка. Кроме того, из того, как работают дженерики, существует только один класс List, независимо от того, сколько мест вы его используете.

В дополнение к простому объявлению и использованию List<Customer>, вы в конце концов захотите передать этот список другому. Избегайте прохождения бетона List<Customer> и вместо этого передайте IList<Customer> или ICollection<Customer>, так как это сделает эти методы более эластичными и прост в программировании.

В один прекрасный день, если вам действительно нужен класс коллекции CustomerList, вы можете реализовать на нем ICollection<Customer> или IList<Customer> и продолжать передавать его этим методам без изменения их или даже лучше знать.

3

Использование наследования для выполнения псевдонимов/typedefing имеет проблему, требующую от вас переопределения соответствующих конструкторов.

Поскольку это быстро становится необоснованным, чтобы делать это везде, вероятно, лучше избегать его для согласованности.