【问题标题】:C#: Can a Child class restrict access to Parent class methods?C#:子类可以限制对父类方法的访问吗?
【发布时间】:2012-06-12 01:39:19
【问题描述】:

我需要两个稍微不同的类,它们具有相同的成员,但其中一个类需要与用户进行较少交互的可能性。我希望从第一个继承第二个类。
有没有办法限制子类对父方法的访问,这样如果有人创建了子对象,他们将无法访问某些父类方法(在父类中是公共的)?

【问题讨论】:

  • 不是你想的那样,不。
  • 不,但如果你举一个更具体的例子,你可能会得到一些更好的想法。
  • 即使您可以限制子类中可用的成员,用户仍然可以将其转换为父类并获得父类功能。您最好的选择是遵循 RJ Lohan 的回答,但随后您会遇到可用性问题,因为您的用户需要知道子类中可用的功能。

标签: c# inheritance


【解决方案1】:

不,原因如下:

class Animal { 
   public void Speak() { Console.WriteLine("..."); }
}

class Dog : Animal { 
   remove void Speak();  // pretend you can do this
}

Animal a = GetAnAnimal(); // who knows what this does

a.Speak();  // It's not known at compile time whether this is a Dog or not

【讨论】:

  • 很好的例子,这完全可以解释为什么我想要的东西不能发生。
【解决方案2】:

你应该有一个基础抽象类来保存两个类的共同点,然后让其他两个类继承它并添加方法和属性等。

abstract class MyBaseClass
{
    public int SharedProperty { get; set; }

    public void SharedMethod()
    {
    }
}

class MyClass1 : MyBaseClass
{
    public void Method1()
    {
    }
}

class MyClass2 : MyBaseClass
{
    public void Method2()
    {
    }
}

MyClass1 有:SharedPropertySharedMethodMethod1

MyClass2 有:SharedPropertySharedMethodMethod2

【讨论】:

    【解决方案3】:

    不完全是,不。您最接近的方法是在基(父)类中提供虚拟方法,并在派生(子)类中覆盖/新方法,并且不提供任何行为或适当的异常;

    public class Base
    {
        public virtual void DoSomething()
        { . . . }
    }
    
    public class Derived : Base
    {
        public override void DoSomething()
        { 
            throw new NotSupportedException("Method not valid for Derived");
        }
    }
    

    【讨论】:

    • 编辑为抛出NotSupportedException 而不是InvalidOperationException,因为它更标准和合乎逻辑,并添加了Base 的缺失继承。
    【解决方案4】:

    创建基类,并保护应该隐藏的方法。

    创建一个接口,声明你想要公开的方法

    创建一个子类,继承自基类,并显式实现接口。从接口实现方法中调用受保护的方法。

    那么子类的用户只能看到接口的成员(这需要他们将实例转换为接口)

    【讨论】:

    • 你能举例说明你是如何做到的吗?简单地将接口添加到子类并调用 base.ProtectedMethod() 在 C# 7.2 中对我不起作用。
    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2012-02-15
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多