每个基础 class 设计的接口
Interface per base class design
假设我有一个客户 Class,它有 CustomerTypeA、CustomerTypeB、CustomerTypeC 作为子 classes。
实现 Customer class 的 ICustomer 接口并创建子类型对象(CustomerTypeA、CustomerTypeB、CustomerTypeC)是否是更好的设计
interface ICustomer {}
class Customer : ICustomer {}
class CustomerTypeA : ICustomer {}
class CustomerTypeB : ICustomer {}
class CustomerTypeC : ICustomer {}
ICustomer obj;
obj = new CustomerTypeB();
或
使用 Customer class 对象声明创建子 classes 的对象?
class Customer {}
class CustomerTypeA : Customer {}
class CustomerTypeB : Customer {}
class CustomerTypeC : Customer {}
Customer obj;
obj = new CustomerTypeB();
我应该如何选择要遵循的方法?
换句话说,每个父对象都从接口实现是不是更好的设计?它给我带来了什么好处?
谢谢
您可以使用任何一种,但人们越来越青睐 composition over inheritance。
它在运行时提供了灵活性并增加了关注点分离。
要确定最适合您的情况,您必须检查类型层次结构可能如何演变、您的实际需求是什么、您希望如何编写自动化测试等。
您通常可以同时使用两者。但是,如果其他地方需要您的 class "Customer",我要么选择第二种解决方案(简单继承),要么将第一种解决方案更改为此(假设您的 CustomerTypes 仍然与 Customer 有一些共同点):
interface ICustomer{}
class Customer:ICostumer{}
class CustomerTypeA:Customer{}
...
使用时:
ICustomer myCustomer=new CustomerTypeA();
我认为这只能通过对特定用例的更多了解来决定。您应该记住的是,在 C# 中,您只能有一个基数 class。因此,您的第二个替代方案只有在您不必从任一子 classes 中的任何其他 classes 继承时才有效。
所以总的来说,我认为第一种方法更灵活,如果你想避免子class中的代码重复,你可能需要考虑在[=10]中实现共享逻辑=] class,并尽可能继承它。当然,如果您的子class之一需要从不同的class 继承,它仍然可以实现ICustomer
。
此外,如果共享逻辑是code/functionality的一大块并且你不能使用继承(因为存在另一个基础class),你也可以考虑使用委托(组合inheritance/strategy 模式)。
假设我有一个客户 Class,它有 CustomerTypeA、CustomerTypeB、CustomerTypeC 作为子 classes。
实现 Customer class 的 ICustomer 接口并创建子类型对象(CustomerTypeA、CustomerTypeB、CustomerTypeC)是否是更好的设计
interface ICustomer {}
class Customer : ICustomer {}
class CustomerTypeA : ICustomer {}
class CustomerTypeB : ICustomer {}
class CustomerTypeC : ICustomer {}
ICustomer obj;
obj = new CustomerTypeB();
或
使用 Customer class 对象声明创建子 classes 的对象?
class Customer {}
class CustomerTypeA : Customer {}
class CustomerTypeB : Customer {}
class CustomerTypeC : Customer {}
Customer obj;
obj = new CustomerTypeB();
我应该如何选择要遵循的方法?
换句话说,每个父对象都从接口实现是不是更好的设计?它给我带来了什么好处?
谢谢
您可以使用任何一种,但人们越来越青睐 composition over inheritance。 它在运行时提供了灵活性并增加了关注点分离。
要确定最适合您的情况,您必须检查类型层次结构可能如何演变、您的实际需求是什么、您希望如何编写自动化测试等。
您通常可以同时使用两者。但是,如果其他地方需要您的 class "Customer",我要么选择第二种解决方案(简单继承),要么将第一种解决方案更改为此(假设您的 CustomerTypes 仍然与 Customer 有一些共同点):
interface ICustomer{}
class Customer:ICostumer{}
class CustomerTypeA:Customer{}
...
使用时:
ICustomer myCustomer=new CustomerTypeA();
我认为这只能通过对特定用例的更多了解来决定。您应该记住的是,在 C# 中,您只能有一个基数 class。因此,您的第二个替代方案只有在您不必从任一子 classes 中的任何其他 classes 继承时才有效。
所以总的来说,我认为第一种方法更灵活,如果你想避免子class中的代码重复,你可能需要考虑在[=10]中实现共享逻辑=] class,并尽可能继承它。当然,如果您的子class之一需要从不同的class 继承,它仍然可以实现ICustomer
。
此外,如果共享逻辑是code/functionality的一大块并且你不能使用继承(因为存在另一个基础class),你也可以考虑使用委托(组合inheritance/strategy 模式)。