【问题标题】:How to hide a method, which is part of an interface implementation within a base class, from classes that derive from the base class?如何从派生自基类的类中隐藏作为基类中接口实现的一部分的方法?
【发布时间】:2014-05-09 10:53:23
【问题描述】:

我有以下结构:

public class Foo : FooBaseNamespace.FooBase
{
    public Foo()
    {
        Register("abc");
    }
}

public class FooBase : IFoo
{
    public FooBase()
    {

    }

    public void Register(string id)
    {

    }
}

public interface IFoo
{
    void Register(string id);
}

请注意,FooBaseIFoo 位于命名空间 FooNamespace,但 Foo 位于不同的命名空间中,但可以访问 FooNameSpace

我的问题是,我可以调整代码以使方法 Register(string id) 对派生自 FooBase 的任何类隐藏吗?

谢谢

【问题讨论】:

  • @Sayse,如果方法是接口实现,怎么办?
  • @Sayse 这并没有改变接口实现将是public 并因此可以访问的事实。我不认为覆盖是问题..
  • 正是为什么我没有将其发布为答案,我不在带有视觉工作室的机器上并且无法检查它..只是指向一个方向。我阅读问题的方式是尝试阻止 FooBase 的继承类覆盖该方法

标签: c# interface derived-class base-class method-hiding


【解决方案1】:

如果你想隐藏它,我真的不明白你为什么要实现IFoo,而且我认为你的建模并不正确。

请参阅Liskov Substitution Principle 了解更多信息。

可替换性是面向对象编程的一个原则。它 指出,在计算机程序中,如果 S 是 T 的子类型,则 T 类型的对象可以替换为 S 类型的对象(即, 类型 S 的对象可以替换类型 T) 的对象而不改变 该程序的任何理想属性(正确性,任务 执行等)。

您可以在您的 FooBase 对象中包含 IFoo 实现(即使用组合)和委托,例如

public class FooBase {
   private IFoo hiddenFoo;
}

或者可能使用多个接口,例如IRegisterableIFoo 并排,其中 IRegisterable 提供 Register() 方法,IFoo 提供其他一切。您可以根据需要选择性地引用IRegisterable

将您的接口定义分成提供不同功能的接口是一种根据对象引用方式赋予对象不同功能的强大方法(例如,一个 DAO 可以同时实现 IReadableIWriteable 并且该功能分别公开给不同的客户)

【讨论】:

  • 我实现IFoo 为基类定义一个契约,但我不希望将这种契约扩展到从基类派生的类。我想我的问题延伸到一般情况。接口实现是否只能扩展到从该接口派生的基类,但不能进一步向下?
  • 在这种情况下我会担心建模是否正确。我希望派生类可以在不改变客户端(消费)代码的情况下被替换
  • 我不确定我是否完全同意我的特定用例必然指向不正确的建模。为基类提供契约并让它去做契约所承诺的工作(接口)并让从基类派生的类不用担心基类执行的工作,这难道不是很有意义吗?而是去做他们自己定义的任务?从 base 派生的类将访问在 base 中操作的属性。
  • 您能否详细说明“根据引用方式赋予对象不同功能的强大手段”的含义。如何让基类从 2 个不同的接口派生,但只将一个接口的方法公开给从基类派生的类?还是我误解了什么,你只是说我试图实现的目标是不可能的?
  • 我可以实现一个类 DaoImpl,它实现了 IWriteable 和 IReadable 接口。然后我可以将它作为 IReadable 或 IWriteable 公开给客户端(not 子类)。根据类的公开方式(可读或可写),客户端可以使用不同的功能,例如我的类可以实现可写功能,但可以简单地向某些客户端公开
猜你喜欢
  • 2012-03-14
  • 1970-01-01
  • 2023-03-28
  • 2010-11-23
  • 2015-05-22
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
相关资源
最近更新 更多