这个设计是个好主意 - 接口和抽象类

时间:2009-01-08 04:10:01

标签: c# generics interface abstract-class

我希望能够做到以下几点:

//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

很抱歉,如果这很难理解我想要了解的内容,基本上我有两个对象将共享comman属性,除了那些将是通用的行集合。我想以最干净的方式做到这一点。

对不起我用powerpoint制作的糟糕图表:)

3 个答案:

答案 0 :(得分:8)

我会说第二种设计更好。更少的项目和更容易的继承路径。

第一个设计有不必要的接口,除非你实现了一些实现接口但不从基类继承的东西,否则你真的不需要它。

答案 1 :(得分:2)

TableTable<string>之间有什么区别?换句话说,您是否可以仅使用Table<string>作为非通用表单?

如果您选择第二个选项,我建议您重命名一个Rows属性 - 您可以通过隐藏来获得两种不同类型的属性等等,但这不会令人愉快。

您的Table类型实际上会有多少行为?如果它实际上只是一个容器,你可能不需要一个接口 - 但是如果它背后有重要的逻辑,你可能想要一个接口,这样你就可以在测试使用它的类时模拟出来。

答案 2 :(得分:1)

我会在行中使用泛型,而不在基类中包含字符串,并且非泛型继承Table类。考虑不使用抽象类。

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