С# - Как сделать метод видимым только для классов, которые наследуют базовый класс метода
У меня есть базовый класс, который помечен как абстрактный. Можно ли сделать метод в этом базовом классе видимым только для других классов, наследующих базовый класс?
Скажем, у меня есть 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...
.