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 abstract
метод/свойство/поле. Вам придется использовать override
ключевое слово в Class2 для его реализации. Это дает Class2 доступ к полю (если вы действительно хотите его абстрактного), но не дает никаких классов, которые не наследуют от class1 доступ к этим полям.
это override
это поможет вам обойти Cannot declare a body...
сообщение.