C# 如何从基类派生的类中隐藏作为基类内接口实现一部分的方法?

C# 如何从基类派生的类中隐藏作为基类内接口实现一部分的方法?,c#,interface,derived-class,base-class,method-hiding,C#,Interface,Derived Class,Base Class,Method Hiding,我的结构如下: public class Foo : FooBaseNamespace.FooBase { public Foo() { Register("abc"); } } public class FooBase : IFoo { public FooBase() { } public void Register(string id) { } } public interface IFoo

我的结构如下:

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
派生的任何类都是隐藏的


谢谢

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

有关更多信息,请参阅

可替换性是面向对象编程的一个原则。信息技术 声明,在计算机程序中,如果S是T的子类型,则 类型T的对象可替换为类型S的对象(即。, 类型S的对象可以替换类型T)的对象而不改变 该程序所需的任何属性(正确性、任务 表演等)

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

public class FooBase {
   private IFoo hiddenFoo;
}
或者可以在
IFoo
旁边使用多个接口,例如
IRegisterable
,其中
IRegisterable
提供了
Register()
方法,而
IFoo
提供了其他一切。您可以根据需要选择性地引用
i注册表


将接口定义分离为提供不同功能的接口是根据对象的引用方式为对象提供不同功能的一种强大方法(例如,一个DAO可以实现
IReadable
IWriteable
,并且该功能分别向不同的客户端公开)

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

有关更多信息,请参阅

可替换性是面向对象编程的一个原则。信息技术 声明,在计算机程序中,如果S是T的子类型,则 类型T的对象可替换为类型S的对象(即。, 类型S的对象可以替换类型T)的对象而不改变 该程序所需的任何属性(正确性、任务 表演等)

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

public class FooBase {
   private IFoo hiddenFoo;
}
或者可以在
IFoo
旁边使用多个接口,例如
IRegisterable
,其中
IRegisterable
提供了
Register()
方法,而
IFoo
提供了其他一切。您可以根据需要选择性地引用
i注册表


将接口定义分离为提供不同功能的接口是根据对象的引用方式为对象提供不同功能的一种强大方法(例如,一个DAO可以实现
IReadable
IWriteable
,并且该功能分别向不同的客户端公开)

@Sayse,how,如果该方法是一个接口实现?@Sayse,这不会改变接口实现是公共的,因此是可访问的。我不认为覆盖是问题相关的:我没有将其作为答案发布的确切原因,我不在visual studio的机器上,也无法检查它。。只是指向一个方向。我阅读这个问题的方式是尝试阻止继承的
FooBase
类重写method@Sayse,如果该方法是一个接口实现,该方法是如何实现的?@Sayse这不会改变接口实现将是公共的,因此是可访问的。我不认为覆盖是问题相关的:我没有将其作为答案发布的确切原因,我不在visual studio的机器上,也无法检查它。。只是指向一个方向。我理解这个问题的方式是尝试阻止继承的
FooBase
类重写我实现的
IFoo
方法来定义基类的约定,但我不希望将这种约定扩展到派生自基类的类。我想我的问题延伸到一般情况。接口实现是否只能扩展到从此类接口派生的基类,而不能进一步扩展?在这种情况下,我会担心建模是否正确。我希望派生类可以在不改变客户机(消费)代码的情况下被替换。我不确定我是否完全同意我的特定用例必然指向错误的建模。为基类提供一个契约,让它去做契约(接口)承诺的工作,让从基类派生的类不用担心基类执行的工作,而是去做它们自己定义的任务,这不是很有意义吗?从基派生的类将访问在基中操作的属性。请详细说明“是根据对象的引用方式赋予对象不同功能的强大手段”的含义。如何让基类从两个不同的接口派生,而只向从基类派生的类公开一个接口的方法?或者我误解了什么,你只是说我试图实现的是不可能的?我可以实现一个类DaoImpl,它实现了接口IWriteable和IReadable。然后,我可以将其作为IReadable或IWriteable公开给客户机(而不是子类)。根据类的公开方式(可读或可写),客户机可以使用不同的功能,例如,我的类可以实现可写功能,但可以以可读的方式公开给某些客户机。我实现
IFoo
来定义