Как сделать метод видимым только для классов, которые наследуют базовый класс метода - PullRequest
11 голосов
/ 16 ноября 2010

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

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

Ответы [ 5 ]

17 голосов
/ 16 ноября 2010
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?

5 голосов
/ 16 ноября 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
  }
}
4 голосов
/ 16 ноября 2010

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

1 голос
/ 16 ноября 2010

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

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

1 голос
/ 16 ноября 2010

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

...