考虑我有一个Customer类,它把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();
我应该如何选择遵循的方法?
换句话说,从接口实现每个父对象是否是更好的设计?它给我带来什么好处?
谢谢
答案 0 :(得分:1)
您可以使用其中任何一种,但是人们越来越喜欢composition over inheritance。 它在运行时提供了灵活性,并增加了关注点的分离。
要确定最适合您的情况,您必须检查类型层次结构可能如何发展,您的实际要求是什么,如何编写自动化测试等。
答案 1 :(得分:1)
通常可以同时使用两者。但是,如果其他地方需要您的类“ Customer”,则我可以使用第二个解决方案(简单继承),也可以将第一个解决方案更改为该解决方案(假设您的CustomerTypes与Customer仍有一些共同之处):
interface ICustomer{}
class Customer:ICostumer{}
class CustomerTypeA:Customer{}
...
使用时:
ICustomer myCustomer=new CustomerTypeA();
答案 2 :(得分:1)
我认为这只能在对特定用例有更多了解的情况下才能决定。您应该记住的是,在C#中,您只能有一个基类。因此,您的第二种选择仅在不必继承任何一个子类中的任何其他类的情况下才有效。
因此,总的来说,我认为第一种方法更灵活,如果您想避免子类中的代码重复,则可能需要考虑在Customer
类中实现共享逻辑并从中继承在任何可能的地方。当然,如果您的子类之一需要继承其他类,则它仍然可以实现ICustomer
。
此外,如果共享逻辑是更大的代码/功能部分,并且您不能使用继承(因为存在另一个基类),则还可以考虑使用委托(在继承/策略模式上进行组合)。 / p>