繁体   English   中英

每个基类设计的接口

[英]Interface per base class design

考虑我有一个客户类别,它有CustomerTypeA,CustomerTypeB,CustomerTypeC作为子类别。

将ICustomer接口实现到Customer类并创建子类型对象(CustomerTypeA,CustomerTypeB,CustomerTypeC)是否是更好的设计?

interface ICustomer {}

class Customer : ICustomer {}

class CustomerTypeA : ICustomer {}
class CustomerTypeB : ICustomer {}
class CustomerTypeC : ICustomer {}

ICustomer obj;
obj = new CustomerTypeB();

要么

使用Customer类对象声明创建子类的对象?

class Customer {}
class CustomerTypeA : Customer {}
class CustomerTypeB : Customer {}
class CustomerTypeC : Customer {}

Customer obj;
obj = new CustomerTypeB();

我应该如何选择遵循的方法?

换句话说,从接口实现每个父对象是否是更好的设计? 它给我带来什么好处?

谢谢

您可以使用其中任何一种,但是人们越来越倾向于使用组合而不是继承 它在运行时提供了灵活性,并增加了关注点的分离。

为了确定哪种情况最好,您必须检查类型层次结构可能如何演变,实际需求是什么,如何编写自动化测试等。

您通常可以同时使用两者。 但是,如果其他地方需要您的类“ Customer”,则我可以使用第二个解决方案(简单继承),也可以将第一个解决方案更改为该解决方案(假设您的CustomerTypes与Customer仍有一些共同之处):

interface ICustomer{}
class Customer:ICostumer{}
class CustomerTypeA:Customer{}
...

使用时:

ICustomer myCustomer=new CustomerTypeA();

我认为这只能通过对特定用例的更多了解来决定。 您应该记住的是,在C#中,您只能有一个基类。 因此,您的第二种选择仅在不必继承任何一个子类中的任何其他类的情况下才有效。

因此,总的来说,我认为第一种方法更为灵活,如果您想避免子类中的代码重复,则可能需要考虑在Customer类中实现共享逻辑,并在可能的情况下从中继承。 如果您的子类之一需要继承自其他类,那么它当然仍可以实现ICustomer

另外,如果共享逻辑是更大的代码/功能部分,并且您不能使用继承(因为存在另一个基类),则还可以考虑使用委托(继承/策略模式上的组合)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM