Является ли этот дизайн хорошей идеей - Интерфейсы и Абстрактный класс - PullRequest
3 голосов
/ 08 января 2009

Я бы хотел сделать что-то вроде следующего:

//non-generic
var MyTable = new Table();
string name = MyTable.Name;
IEnumerable<String> rows = MyTable.Rows;

//generic
var MyTableGeneric = new Table<MyType>();
string name = MyTableGeneric.Name;
IEnumerable<MyType> rows = MyTableGeneric .Rows;

Будет ли что-то подобное многим:

http://img81.imageshack.us/img81/427/diagramcm3.jpg

или это было бы лучше:

http://img301.imageshack.us/img301/4136/presentation1nh9.jpg

Извините, если трудно понять, к чему я стремлюсь, в основном у меня есть два объекта, которые будут иметь общие свойства, за исключением коллекций строк, которые будут общими. Я хотел бы сделать это самым чистым способом.

Извините за мои дерьмовые диаграммы, сделанные в powerpoint:)

Ответы [ 3 ]

8 голосов
/ 08 января 2009

Я бы сказал, что второй дизайн лучше. Меньше предметов и проще путь наследования.

Первый дизайн имеет ненужные интерфейсы, которые вам не нужны, если вы не реализуете что-то еще, что реализует интерфейс, но не наследуется от базового класса.

2 голосов
/ 08 января 2009

Какая разница между Table и Table<string>? Другими словами, вы не можете просто использовать Table<string> в качестве своей неуниверсальной формы?

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

Какое поведение на самом деле будет иметь ваш Table тип? Если на самом деле это просто контейнер, вам может не понадобиться интерфейс - но если он имеет существенную логику, возможно, вы захотите иметь интерфейс, чтобы вы могли макетировать таблицу при тестировании класса, который его использует.

1 голос
/ 08 января 2009

Я бы использовал дженерики в строках без использования строки в базовом классе, а неуниверсальный наследовал класс Table. Не используйте абстрактный класс.

Table<T> -> Table:Table<string>
...