2010-06-24 82 views
5

我必须结构应用的新模式,我做的更好,不懂什么叫:继承或枚举

通过继承或使用枚举类型的对象:

例如:

书籍

class Book 
{ 
public string Name {get;set;} 

public string Author {get;set;} 

public int NumberOfPages {get;set;} 

} 

public class Encyclopedie:Book 
{ 

} 

public class Novel:Book 
{ 

} 

或更好地利用:

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, 
... 
} 

回答

21

如果不同类型有显着差异(如何处理和处理它们),请使用继承。也就是说,如果你打算全部使用多态,你应该使用继承。

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

+0

绝对同意。我正在考虑如何表达“显着差异”。可怜的英语:( – 2010-06-24 07:57:38

+1

赞同,似乎他只希望看到它作为不同的类型。继承是一个强大的耦合,当你有一本跨越流派的书时会发生什么?切换到C++允许多继承?一个[Flag]'ed enum可能是一个很好的选择 – simendsjo 2010-06-24 08:00:15

+0

+1对于一个非常明确的答案。唯一正确的答案恕我直言。 – pyrocumulus 2010-06-24 08:38:27

0

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

2

我会说第二个会更好,因为你并没有真正扩展你的百科全书的书类,没有额外的属性或功能,你需要给另一个书类型。

2

“最好”是主观的,并且严重依赖于课堂/模型的目的。 你的目标是什么?你想实现什么?

至少在这一点上,我可以说的是,继承是有用的,当派生类有一些相当独特的属性 - 像Encyclopedie有属性解释哪种类型的Encyclopedie它实际上是这些属性不以任何方式属于到小说。

0

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

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

-1

使用枚举“键入”您的对象听起来有点“旧C风格”编程。

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

当然,您可以用“if-then-else”的处理方式处理此问题,但继承似乎是我的观点中更清晰的选择。

再见!

+0

当反序列化数据时,你会如何区分继承类?我唯一看到的方法是将类名包含在序列化的对象(你也可以通过在枚举上调用tosting()来做到这一点) – apoorv020 2010-06-24 08:19:34

+0

XmlSerializer返回类型化数据 - 确保你可以使用枚举并切换它,但为什么当“类型”已经提供了相同的东西呢? 另外:如果你只是使用一个类和一个“枚举”来键入它,你将不得不将所有*类型所需的属性放在那个类中秒。你可能有一个属性“XYZ”需要通过类型“BookAAA”,而不是通过类型“NovelBBB” - 这不是很好,恕我直言,当你可以通过继承避免这种情况。 – 2010-06-24 09:21:03

0

我想你应该根据书的“目的”来做出这个选择。如果书不需要任何额外的东西(方法和属性....)枚举应该是足够的。如果你必须为每本书创建一个共同的行为,并且为每种书类型创建更具体的东西,那么显然需要继承(抽象类“book”和具体类)。

3

在真正面向对象的系统中,对象的类型对客户端来说是透明的。所以处理书籍的代码不应该知道书的类型是什么,而只是调用书本上的方法。

因此,如果您需要在本书中实现不同的行为以响应方法调用,请扩展Book并覆盖它的一些方法。如果你不这样做,那就不要。

看来,鉴于你的子类的空体,它们的行为方式与书本相同。所以你只是用一些额外的数据来标记这本书 - 百科全书与小说之间的区别对于本书而言不是重要的,而不是精装本或软背本或者大字体或标准印刷体 - 客户可能会以不同的方式使用这些书,而且每本书都是大的印刷书或它是一本标准印刷书,但这些都是本书的所有特征,而不是本质区别。

我不需要使用enum作为书类,因为您可能想要添加更多数据 - 我要么使用松散的标记系统,以便您可以标记具有各种类型集合的书 - 所以您将会有一本书被标记为{'children's','ornithological','encyclopaedia',}或者允许角色结构的书 - 所以在需要时会创建'儿童鸟类百科全书',但没有固定枚举。