С# - Как сделать метод видимым только для классов, которые наследуют базовый класс метода

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

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

Ответ 1

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?

Ответ 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

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

Ответ 4

Используйте ключевое слово protected.

Ответ 5

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

Это override, который поможет вам найти сообщение Cannot declare a body....