为了清楚起见,继承课程是否可以接受?

时间:2013-02-04 06:26:14

标签: c# oop

假设我有一个只存储键/值对的模板/泛型类:

public class GenericDatabase<Key, T>
{
 public Dictionary<Key, T> Data { get; set; }               

 public GenericDatabase()
 {
   Data = new Dictionary<Key, T>();
 }
 ...
}

为了清楚起见,在不引入任何新方法或成员变量的情况下从中派生类是否可以接受?例如,假设我想要一个角色数据库:

public class CharacterDatabase : GenericDatabase<string, CharacterStat>
{
   // no new methods or member variables
}

4 个答案:

答案 0 :(得分:3)

IMO 为了清晰起见,引入一定程度的继承会让其他开发人员感到困惑。我认为通用声明足够清楚。

GenericDatabase<string, CharacterStat>

答案 1 :(得分:1)

它是一种不同的语言..但请看一下how c++ defines its std::string class

typedef basic_string<char> string;

只是想指出这种做法不仅常见,而是由标准图书馆编写者自己使用。

如果您要多次使用CharacterDatabase,我会支持这样的步骤。另外,我不确定C#是否提供了除继承之外的任何其他更简单的机制(如C ++的typedef),但这是首选。

The using directive can be used like a typedef,但它只影响声明它的文件。

using CharacterDatabase = GenericDatabase<string, CharacterStat>

答案 2 :(得分:1)

在OOP中没有什么能阻止你这样做。但是,我在许多地方看到他们使用 Marker Interfaces 而不是基类来表示某些东西。标记接口通常没有公共成员,只能用于将类标记为的一个示例。

您可以查看以下链接:

Wikipedia => marker interface pattern

What is a marker interface

答案 3 :(得分:1)

对我来说,这取决于所使用的具体类型。

如果我有

GenericDatabase<string, CharacterStat>

我会保持原样 - 很清楚。 但如果我有

GenericDatabase<string, ArrayList<Pair<CharacterStat,Integer> > >

然后我肯定会给它一个名字,一个真正解释的名字;)。