C# 继承或枚举

C# 继承或枚举,c#,inheritance,modeling,C#,Inheritance,Modeling,我必须为应用构建新模型,我不知道什么更好: 使用继承或使用枚举作为对象类型: 例如: 书 或更好地使用: class Book { public BookType Type {get;set;} public string Name {get;set;} public string Author {get;set;} public int NumberOfPages {get;set;} } public enum BookType { Encyclopedie = 0, Novel

我必须为应用构建新模型,我不知道什么更好:

使用继承或使用枚举作为对象类型:

例如:

或更好地使用:

class Book
{

public BookType Type {get;set;}

public string Name {get;set;}

public string Author {get;set;}

public int NumberOfPages {get;set;}

}

public enum BookType
{
Encyclopedie = 0,
Novel = 1,
...
}

如果不同类型有显著差异(如何处理和处理它们),则使用继承。也就是说,如果要使用多态性,就应该使用继承


如果您只需要一种方法来区分不同类型的书籍,请使用Enum。

这取决于具体情况。如果需要使用多态性,第一种解决方案更好。从我个人的观点来看,我更喜欢使用继承

我想说,第二种更好,因为您没有真正扩展百科全书中的图书类,您不需要为一种图书类型提供额外的属性或功能。

最佳”是主观的,在很大程度上取决于类/模型的目的。 你的目标是什么?你想要实现什么


在这一点上,我最多只能说,当派生类具有一些相当独特的属性时,继承是有用的,比如百科全书的属性解释了它实际上是哪种类型的百科全书,而这些属性无论如何都不是,属于一本小说。

如果不同类型的书籍具有不同的属性,那么您应该明确使用继承模型。这也允许多态性,这通常更好

如果它们都具有相同的属性,那么最好使用枚举。但这一切都取决于应用程序。

使用枚举“键入”对象听起来有点“老式C风格”编程

我的意思是,这是可以的,但是当继承可用时(您使用的是C#),它通常是一个更好的选择。枚举通常会带来一些“麻烦”,例如在序列化/反序列化数据时:如果应用程序的旧版本使用“较新”的场景,其中图书类型具有未知项,该怎么办?(向后/向前兼容性可能是您的应用程序的一项要求)

当然,您可以用“if-then-else”来处理这个问题,但在我看来,继承似乎是一个更干净的选择


再见

我认为你应该根据《目的》一书的内容做出选择。如果书不需要任何额外的东西(方法和属性…),枚举就足够了。如果您必须为每本书创建一个通用行为,并且为每种书类型创建一些更具体的行为,那么您显然需要继承(抽象类“book”和具体类)。

在真正的面向对象系统中,对象的类型对客户机是透明的。因此,处理书籍的代码不应该知道书籍的类型,而应该只调用书籍上的方法

因此,如果您需要在书中实现不同的行为来响应方法调用,请扩展书并重写它的一些方法。如果你没有,那就不要

看来,考虑到子类的主体是空的,它们在各个方面的行为都与书籍一样。因此,你只是用一些额外的数据来标记这本书-百科全书和小说之间的区别对于这本书来说并不比精装本、软装本、大号印刷本或标准印刷本更重要-客户可能会以不同的方式使用这些数据,每本书要么是一本大号印刷本,要么是一本标准印刷本,但这些都是本书的特点,而不是本质的区别


我不需要为图书种类使用枚举,因为您可能需要添加更多数据-我可以使用松散的标记系统,这样您就可以用一系列种类标记图书-这样您就可以将图书标记为{‘儿童’、‘鸟类’、‘百科全书’、}-或允许角色中的结构-因此在需要时创建“儿童鸟类百科全书”的角色,但没有固定的枚举

绝对同意。我刚才在想如何表达“重大差异”。可怜的英语:(同意)他似乎只想把它看成不同的类型。继承使一种强耦合,当你有一本跨类型的书时会发生什么?切换到C++允许多重继承?'在这里,ed enum可能是一个不错的选择。在反序列化数据时,如何区分继承的类?我看到的唯一方法是将类名包含在序列化对象的每个实例中(也可以通过调用enum上的tosting()来实现此目的)XmlSerializer返回类型化数据-当然可以使用枚举并打开它,但是当“类型”已经提供了相同的内容时为什么要这样做呢?另外:如果只使用一个类和一个“枚举”来键入数据,则必须将各种类型所需的所有属性放入该类中。类型可能需要一个属性“XYZ”“BookAAA”,但不是按类型“novelbb”-这不太好,IMHO,当你可以通过继承来避免这种情况时。
class Book
{

public BookType Type {get;set;}

public string Name {get;set;}

public string Author {get;set;}

public int NumberOfPages {get;set;}

}

public enum BookType
{
Encyclopedie = 0,
Novel = 1,
...
}