【问题标题】:How to correctly inherit and hide base method如何正确继承和隐藏基方法
【发布时间】:2012-10-23 20:10:04
【问题描述】:

我有以下继承:

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 是否有标准的处理方式?

【问题讨论】:

  • 这看起来很像XY Problem。您在解决某些未告诉我们的问题时遇到了问题。每个基本类型和派生类型的目标是什么?
  • 感谢您的想法,但我认为以下答案足以理解我的需要。再次感谢。

标签: c# .net oop inheritance


【解决方案1】:

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

A obj = new C();

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

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

【讨论】:

  • 好吧,A类有很多代码实现B和C的共同行为,只是C比B多一个参数,所以我真的认为C是A的超类。你的例子会'不起作用,因为 A 类是一个抽象的受保护类,包含 B 和 C 的共同点。
  • @SoMoS 我的观点是,它是多态性的一个基本概念,您可以将对象视为其基类之一,因此我发布的代码必须 i> 能够工作;你想做的事情会违反这一点。如果A 是一个抽象基类,那么它可能不应该有Configure 方法。听起来 BC 应该有它,并带有适当的重载。
【解决方案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)  {...};
}

【讨论】:

  • 我不能主要是因为 MVVM 和 IoC。我喜欢过去你可以把所有需要的东西放在构造函数上。
  • @SoMoS 好吧,那么您描述的“保护和发布”方法是最好的方法:它可以让您控制公开Configure 并只需很少的工作即可使用正确的签名。跨度>
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 2020-11-13
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 2015-03-26
相关资源
最近更新 更多