避免许多继承类

时间:2010-09-20 10:39:53

标签: c# oop interface types abstract-class

假设我有这门课(仅作为一个例子):

internal class Packet
{

    private readonly UInt32 _length;
    private readonly Byte _type;
    private readonly UInt32 _requestId;

}

有许多不同类型的数据包,每个数据包都继承自此类,每个数据包类型可以包含任意数量的不同类型的属性。

有没有办法在不使用继承的情况下实现每种类型的数据包?

我考虑使用List<Tuple<Type,Value>> _typesSpecificValues之类的属性 - 我知道它不会编译但我不知道如何表达我的意思。

我需要避免为每种类型的数据包创建一个继承类,因为大约有50种类型 - 或者我只是在懒惰?

4 个答案:

答案 0 :(得分:7)

听起来你应该创建单独的类,是的。

然而,我不确定我是否会将它们从这个课程中衍生出来。听起来这应该是Header类(或者甚至是结构),然后你可以有多个类,每个包含一个Header

答案 1 :(得分:2)

根据你的简短描述,听起来更像是结构而不是类。再看看你的50多个不同的定义,并试着看看它们的真正不同之处。例如,如果有一半被处理,那么你真的只有两个知道如何处理不同结构的类。

答案 2 :(得分:1)

你需要问自己的是:有没有理由单独使用'Packet'?。您是否会在所有/大多数用途中访问基类的属性?

例如,假设你有:

public class CommPacket : Packet
{
    public string Message { get; set; }
}

访问CommPacket.Length是否典型?或者将CommPacket传递给接受Packet作为参数的某个类是否有意义?如果其中任何一个的答案为是,那么您应该使用基类。

答案 3 :(得分:1)

如果你有很多不同类型的类,它们之间有许多不同的特性,你不应该使用继承,而应该使用Composition。

阅读this article,它解释得比我更好。

修改

阅读优秀书籍Head First: Design Patterns

中关于装饰者模式的更好章节

为了确保我在这里引起你对这本书的关注,有一些截图:

<强>继承 Inheritance

<强>组合物 Composition