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

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

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


person PICyourBrain    schedule 16.11.2010    source источник


Ответы (5)


Почему бы не объявить метод 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
    }
}
person George Stocker    schedule 16.11.2010

Похоже, вы ищете ключевое слово 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
  }
}
person JaredPar    schedule 16.11.2010

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

person Adam Maras    schedule 16.11.2010

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

person slamballx    schedule 16.11.2010

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

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

person Chris Pfohl    schedule 16.11.2010