C# - как сделать метод видимым только для классов, наследующих базовый класс метода

У меня есть базовый класс, который помечен как абстрактный. Можно ли сделать метод в базовом классе только видимым для других классов, которые наследуют базовый класс?

скажем, у меня есть Class1, который является моим базовым классом и помечен как абстрактный. Class2 наследует Class1 и может вызывать все его общедоступные методы. Я хочу, чтобы Class3 создавал экземпляр Class2, но не мог совершать вызовы определенных методов Class1. Я попытался отметить эти методы как абстрактные, но затем я получаю ошибку, когда Class2 пытается их использовать. Ошибка: "...Невозможно объявить тело, потому что оно помечено как абстрактное"

5 ответов


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

почему бы не объявить метод protected?


похоже, вы ищете 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
  }
}

вам нужно отметить их как в Class1, так и в Class2 как protected. Этот модификатор доступа позволяет производному классу(классам) получить доступ к члену, но ничто за пределами производного класса(классов) не может его видеть.


использовать protected ключевое слово.


Я думаю, вы хотите protected abstract метод/свойство/поле. Вам придется использовать override ключевое слово в Class2 для его реализации. Это дает Class2 доступ к полю (если вы действительно хотите его абстрактного), но не дает никаких классов, которые не наследуют от class1 доступ к этим полям.

это override это поможет вам обойти Cannot declare a body... сообщение.