假设我有这门课(仅作为一个例子):
internal class Packet
{
private readonly UInt32 _length;
private readonly Byte _type;
private readonly UInt32 _requestId;
}
有许多不同类型的数据包,每个数据包都继承自此类,每个数据包类型可以包含任意数量的不同类型的属性。
有没有办法在不使用继承的情况下实现每种类型的数据包?
我考虑使用List<Tuple<Type,Value>> _typesSpecificValues
之类的属性 - 我知道它不会编译但我不知道如何表达我的意思。
我需要避免为每种类型的数据包创建一个继承类,因为大约有50种类型 - 或者我只是在懒惰?
答案 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
中关于装饰者模式的更好章节为了确保我在这里引起你对这本书的关注,有一些截图:
<强>继承强>
<强>组合物强>