如何正确继承和隐藏基本方法

时间:2012-10-23 20:10:04

标签: c# .net oop inheritance

我有以下继承:

class A
{
    void Configure(object param1) {...};
}

class B : A
{
    void Configure(object param1) {...}; // The method is not defined in B, it is available from the base class. This is just the desired interface of class B
}

class C : A
{
    void Configure(object param1, object param2) {...};
}

我不希望C类具有可见的param1配置,因为在这种情况下它会使对象不完整。

我尝试覆盖但覆盖无法改变可见性。

我找到的唯一方法是调用类A方法protected void ConfigureBase(object param1) {...};并使方法配置B类调用ConfigureBase。

由于我对这个设计并不完全满意,因为它让我重新定义了每个类,所以Configure有一个标准的处理方法吗?

2 个答案:

答案 0 :(得分:5)

这是不可能的。你可能有这个方法只是抛出一个异常所以它不能被使用,但编程中继承的基本原则之一是,一个孩子总是可以被视为它的父类型。以下应该做什么:

A obj = new C();

obj.Configure(new object());//should this work, or not?

按照设计,没有办法限制孩子不能做父母可以做的事情。如果C确实无法访问Configure(object obj)方法,则需要从根本上重新设计您的程序。这可能意味着C实际上不应该扩展AAC实现公共接口可能是有意义的。),或者只是{ {1}}实际上不应该是该类型的公共方法。如果不了解更多信息,很难提出替代方案。

答案 1 :(得分:2)

  

有没有一种标准的处理方式?

是:使配置过程成为初始化的一部分。

不是暴露Configure,而是在构造函数中执行所有初始化。这将让您的课程只公开有意义的替代方案:

class A {
    public A(object param1) {...};
}

class B : A {
    public B(object param1) : base(param1) {...}; // This re-exposes A's constructor
}

class C : A {
    // Note that A(param1) constructor is not available, even though C inherits A
    public C(object param1, object param2) : base(param1)  {...};
}
相关问题