【问题标题】:C# - How to make a method only visible to classes that inherit the base class of the methodC# - 如何使方法仅对继承该方法的基类的类可见
【发布时间】:2011-05-10 22:50:58
【问题描述】:

我有一个标记为抽象的基类。是否可以使该基类中的方法仅对继承该基类的其他类可见?

假设我有 Class1,它是我的基类并被标记为抽象。 Class2 继承 Class1 并且可以调用它的所有公共方法。我希望 Class3 创建 Class2 的实例,但不能调用 Class1 的某些方法。我尝试将这些方法本身标记为抽象,但是当 Class2 尝试使用它们时出现错误。错误是:“...无法声明主体,因为它被标记为抽象”

【问题讨论】:

    标签: c# methods abstract-class


    【解决方案1】:

    为什么不声明方法protected

    public abstract class Class1
    {
        protected abstract void Method1();
        public abstract void Method2();
    }
    
    public class Class2 : Class1
    {
        protected override void Method1()
        { 
            //Class3 cannot call this.
        }
      
        public override void Method2()
        {
            //class 3 can call this.
        }
    }
    
    public class Class3 
    { 
        public void Method()
        {
            Class2 c2 = new Class2();
            c2.Method1(); //Won't work
            c2.Method2(); //will work
        }
    }
    

    【讨论】:

      【解决方案2】:

      听起来您正在寻找protected 关键字。这限制了带有 protected 标记的成员仅用于声明类型或派生自该类型的类型。

      abstract class Class1 {
        protected void Method1() {
          ...
        }
      }
      
      class Class2 : Class1 {
        public void Method2() {
          Method1(); // Legal
        }
      }
      
      class Class3 { 
        public void Example() {
          Class2 local = new Class2();
          local.Method2();  // Legal
          local.Method1();  // Illegal since Method1 is protected
        }
      }
      

      【讨论】:

        【解决方案3】:

        您需要在 Class1 和 Class2 中将它们标记为protected。此访问修饰符允许派生类访问成员,但派生类之外的任何内容都无法看到它。

        【讨论】:

          【解决方案4】:

          使用protected 关键字。

          【讨论】:

            【解决方案5】:

            我想你想要一个protected abstract 方法/属性/字段。不过,您必须在 Class2 中使用 override 关键字来实现它。这使 Class2 可以访问该字段(如果您真的希望它是抽象的),但不会让任何不从 class1 继承的类访问这些字段。

            override 可以让您了解Cannot declare a body... 消息。

            【讨论】:

              猜你喜欢
              • 2013-09-06
              • 1970-01-01
              • 1970-01-01
              • 2011-01-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-02-05
              • 2021-07-19
              相关资源
              最近更新 更多