1

我有以下继承:

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 类的方法 Configure 调用 ConfigureBase。

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

4

2 回答 2

5

这是不可能的。您可能让该方法抛出异常,因此无法使用它,但编程中继承的基本原则之一是始终可以将子级视为其父级类型。以下应该怎么做:

A obj = new C();

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

按照设计,没有办法限制孩子不能做父母可以做的事情。C如果真的不应该访问方法,您将需要从根本上重新设计您的程序Configure(object obj)。这可能意味着它C真的不应该扩展A(它可能对两者都有意义A并且C实现一个公共接口。),或者只是它Configure真的不应该是那种类型的公共方法。在不了解更多信息的情况下,很难提出替代方案。

于 2012-10-23T20:13:23.463 回答
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)  {...};
}
于 2012-10-23T20:14:12.977 回答