代码之家  ›  专栏  ›  技术社区  ›  user282807

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

  •  0
  • user282807  · 技术社区  · 14 年前

    我有一个方法接口 Validate() 以及一个抽象类,它实现了这个接口,并使一个类 CustomerValidator 继承抽象类的,还具有实体 Customer 继承 客户验证人 所以我可以打电话 customer.Validate() 在库项目中。

    我的方案是,我不希望在客户机代码上使用validate方法。如果他们创建了一个客户,他们应该只看到实体属性..ex fistname等。如何隐藏验证方法?谢谢

    4 回复  |  直到 14 年前
        1
  •  0
  •   bitxwise    14 年前

    我还要问为什么 Customer 继承 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 范围,以便客户端无法使用此调用。

    至于使用作文,我不认为 顾客 应该知道什么 客户验证人 ICustomerValidator . 这些外部责任不在 顾客 类。如果有的话, 客户验证人 可以有一个 顾客 属性,如果您坚持使用composition,但我认为接口应该接受 顾客 改为参数。

        2
  •  2
  •   Oded    14 年前

    使用组合而不是继承。

    为什么你的 Customer 类继承自 CustomerValidator ?它是 客户验证人 是吗?

    你可以有一个私人的 客户验证人 你的领域 顾客 上课-你可以打电话 Validate 关于它。

    我的例子是C语言,虽然这个原理适用于Java和其他OOP LANGAUG:

    // 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);
    
        3
  •  0
  •   Ray    14 年前

    我可以想出一个稍微不同的方法来组织你的课程。您希望客户机了解的部分(“客户”类)包含所有可查看的属性。在您的lib内部,您使用包含客户实体的包装类。因此,您的librabry使用一组完整的方法,使用包含客户类但有更多方法的包装类,并且客户机将costumer类传递给您的lib,后者在继续之前对其进行包装。

        4
  •  0
  •   user282807    14 年前

    我知道客户不是customervalidator……也许名称有点混乱,但在我的例子中,我让客户实现customervalidator,在该构造函数中添加验证规则,并保持customer类的整洁。但我找到了问题的答案,所以我所做的就是实现一个接口,其中validate方法是显式的。因此,在客户机代码中,验证在客户实体中不可见。