隐藏客户端项目中的继承成员

时间:2010-11-27 12:38:35

标签: .net inheritance

我有一个方法Validate()的接口和一个实现此接口的抽象类,并创建了一个名为CustomerValidator的类,它继承了抽象类,还有实体Customer inherit { {1}}所以我可以在图书馆项目中调用CustomerValidator

我的情况是,我不希望验证方法在客户端代码上可用。如果他们新建客户,他们应该只看到实体属性.ex fistname等。我如何隐藏验证方法?感谢

4 个答案:

答案 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不应该对CustomerValidatorICustomerValidator有所了解。这些外部责任超出了Customer类的范围。如果您坚持使用合成,CustomerValidator可以拥有Customer属性,但我认为接口应该采用Customer参数。

答案 3 :(得分:0)

我知道客户不是CustomerValidator ..可能这个名字有点混乱,但在我的情况下,我让Customer实现CustomerValidator,在构造函数中添加验证规则并保持Customer类干净。但我找到了我的问题的答案,所以我所做的是实现接口,其中validate方法是显式的。因此,在客户端代码验证在Customer实体中不可见。