我有一个方法Validate()
的接口和一个实现此接口的抽象类,并创建了一个名为CustomerValidator
的类,它继承了抽象类,还有实体Customer
inherit { {1}}所以我可以在图书馆项目中调用CustomerValidator
。
我的情况是,我不希望验证方法在客户端代码上可用。如果他们新建客户,他们应该只看到实体属性.ex fistname等。我如何隐藏验证方法?感谢
答案 0 :(得分:2)
使用合成。而不是继承。
为什么您的Customer
类继承自CustomerValidator
?它是不一个CustomerValidator
,是吗?
您可以在CustomerValidator
课程中设置私人Customer
字段 - 您可以在其上调用Validate
。
我的例子是在C#中,虽然该原则适用于Java和其他OOP语言:
// I would use DI of some sort to decouple the classes. This is just illustative
private CustomerValidator cv = new CustomerValidator();
// Somewhere else in the customer class:
cv.Validate(this);
答案 1 :(得分:0)
我可以想到如何组织课程的方式略有不同。您希望客户了解的部分(“客户”类)包含所有可见的属性。在lib的内部,您使用包含客户实体的包装类。因此,您的librabry使用一整套方法,使用包含customer类但包含更多方法的包装类,并且客户端将costumer类传递给lib,然后在继续之前将其包装起来。
答案 2 :(得分:0)
我还必须问为什么Customer
继承CustomerValidator
,还有为什么CustomerValidator
是抽象的?我建议您按如下方式更改界面和实现:
public interface ICustomerValidator {
void Validate(Customer customer);
}
public abstract class CustomerValidator : ICustomerValidator {
public abstract void Validate(Customer customer);
}
然后,如果你坚持能够做类似的事情
Customer customer = new Customer();
customer.Validate();
我建议你像这样使用C# extension methods:
public static class CustomerExentions {
public static ICustomerValidator CustomerValidator { get; set; }
internal static void Validate(this Customer c) {
if(CustomerValidator == null) {
throw new InvalidOperationException("CustomerValidator cannot be NULL");
}
CustomerValidator.Validate(c);
}
}
请注意internal
范围,以便客户端无法使用此调用。
至于使用构图,我认为Customer
不应该对CustomerValidator
或ICustomerValidator
有所了解。这些外部责任超出了Customer
类的范围。如果您坚持使用合成,CustomerValidator
可以拥有Customer
属性,但我认为接口应该采用Customer
参数。
答案 3 :(得分:0)
我知道客户不是CustomerValidator ..可能这个名字有点混乱,但在我的情况下,我让Customer实现CustomerValidator,在构造函数中添加验证规则并保持Customer类干净。但我找到了我的问题的答案,所以我所做的是实现接口,其中validate方法是显式的。因此,在客户端代码验证在Customer实体中不可见。