3

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

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

4 回答 4

3

IMO为清楚起见引入一定级别的继承会使其他开发人员感到困惑。我认为通用声明已经足够清楚了。

GenericDatabase<string, CharacterStat>
于 2013-02-04T06:29:29.187 回答
1

它是一种不同的语言.. 但看看c++ 是如何定义它的std::stringclass的。

typedef basic_string<char> string;

只是想指出,这种做法不仅常见,而且标准库编写者自己也使用。

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

using 指令可以像 typedef 一样使用,但它只影响声明它的文件。

using CharacterDatabase = GenericDatabase<string, CharacterStat>
于 2013-02-04T06:30:16.313 回答
1

在 OOP 中,没有什么可以阻止您这样做。但是,我在很多地方看到他们使用标记接口而不是基类来表示某些东西。标记接口通常没有公共成员,仅用于将类标记为某事的示例

你可以看看这些链接:

Wikipedia => 标记界面模式

什么是标记界面

于 2013-02-04T06:30:47.900 回答
1

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

如果我有

GenericDatabase<string, CharacterStat>

我会保持原样 - 很明显。但如果我有

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

那么我肯定会给它一个名字,而且是一个真正解释性的名字;)。

于 2013-02-04T20:11:57.340 回答