我有以下结构:
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);
}
请注意,FooBase
和IFoo
位于名称空间FooNamespace
中,但Foo
位于不同的名称空间中,但可以访问FooNameSpace
。
我的问题是,我可以调整代码,以便从Register(string id)
派生的任何类中隐藏方法FooBase
吗?
由于
答案 0 :(得分:4)
我真的不明白为什么你要实施IFoo
,如果你想隐藏它,我认为你的建模并不是真的正确。
有关详细信息,请参阅Liskov Substitution Principle。
可替代性是面向对象编程的一个原则。它 声明,在计算机程序中,如果S是T的子类型,那么 类型T的对象可以用类型S的对象替换(即, 类型S的对象可以替换类型为T)的对象而不改变 该程序的任何理想属性(正确性,任务 表演等。)。
您可以在IFoo
对象中包含FooBase
实现(即使用合成)并委托代理。
public class FooBase {
private IFoo hiddenFoo;
}
或者可能使用多个接口,例如IRegisterable
旁边IFoo
,其中IRegisterable
提供Register()
方法,IFoo
提供其他所有内容。您可以根据需要有选择地引用IRegisterable
。
将接口定义分离为提供不同功能的接口是一种强大的方法,可以根据对象的引用方式为对象提供不同的功能(例如,一个DAO可以同时实现IReadable
和IWriteable
功能分别暴露给不同的客户端)