2

我有以下结构:

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);
}

请注意,FooBaseandIFoo驻留在命名空间中FooNamespace,但Foo驻留在不同的命名空间中,但可以访问FooNameSpace.

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

谢谢

4

1 回答 1

4

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

有关更多信息,请参阅Liskov 替换原则

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

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

public class FooBase {
   private IFoo hiddenFoo;
}

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

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

于 2014-05-09T11:00:44.777 回答