У меня есть базовый класс O
и два производных класса: A : O
и B : O
вроде этого:Защищенный член недоступен в производном классе?
public abstract class O
{
public O(string val)
{
this.Value = val;
}
private string value;
public string Value
{
get { return this.value; }
set
{
this.value = value;
RaiseValueChanged();
}
}
protected delegate void ValueChangedEventHandler();
protected event ValueChangedEventHandler ValueChanged;
protected void RaiseValueChanged()
{ if (ValueChanged != null) ValueChanged(); }
}
public sealed class A : O
{
public A(string val)
: base(val) { }
}
public sealed class B : O
{
public B(string val, A instance)
: base(val)
{
instanceA = instance;
}
private A instanceA;
public A InstanceA
{
get { return instanceA; }
set
{
instanceA = value;
}
}
public void MyMethod()
{
//Some stuff..
}
}
Я хочу назвать B.MyMethod();
когда B.instanceA.ValueChanged
поднимается, но я был удивлен, когда я узнал, что я могу» т просто сделать это следующим образом:
public sealed class B : O
{
public B(string val, A instance)
: base(val)
{
instanceA = instance;
//instanceA.ValueChanged += MyMethod;
}
private A instanceA;
public A InstanceA
{
get { return instanceA; }
set
{
//instanceA.ValueChanged -= MyMethod;
instanceA = value;
//instanceA.ValueChanged += MyMethod;
}
}
public void MyMethod()
{
//Some stuff..
}
}
по MSDN:
Защищенное ключевое слово - модификатор доступа к членству. Защищенный член доступен в своем классе и экземплярах производного класса.
Но хотя оба A
и B
были производные классы от O
, они не могли использовать друг друга базовых защищенных членов.
Любые предложения обойти это в моем случае? (Вместо того, чтобы событие public
)
Почему бы вам не сделать это мероприятие общедоступным? Вы хотите, чтобы только определенные типы могли регистрироваться? –
'B' не наследуется от' A', поэтому вы не можете получить доступ к этому событию. Они имеют одну и ту же базу, но не наследуют. –
@YuvalItzchakov Да, я хочу, чтобы только зарегистрированные классы 'O' регистрировались. –