我已经读过可以从派生类访问受保护的成员,但以下内容不起作用。
class A
{
protected int Test;
}
class B:A
{
A instanceOfA= new A()
public B()
{
instanceOfA.Test //Not possible
}
}
答案 0 :(得分:26)
我已经读过可以从派生类访问受保护的成员。为什么我使用“受保护”不起作用?
这是非法的,因为您没有保证您正在访问“B”实例的数据。考虑类似的情况:
abstract class BankAccount
{
protected int accountNumber;
}
class SwissBankAccount : BankAccount
{
}
--- in another assembly, evil-doers write ---
class EvilBankAccount : BankAccount
{
void DoEvil()
{
BankAccount b = GetASwissBankAccount();
int number = b.accountNumber;
}
}
EvilBankAccount不会从SwissBankAccount继承,因此不允许在EvilBankAccount中使用SwissBankAccount的受保护成员。您可以访问“父母”的受保护成员,但不能访问“兄弟姐妹”! EvilBankAccount只能访问受保护的成员的EvilBankAccount (或从EvilBankAccount派生的类型)。 SwissBankAccount的受保护成员不受限制。
规则是受保护实例成员访问到的“receiver”表达式的类型必须至少与包含的类型声明一样派生。会员访问。有关规则的准确措辞和一些说明性示例,请参阅C#4.0规范的第3.5.3节。
顺便说一下,C ++也有这个规则。
这条规则经常被误解。有关此规则的更深入分析以及受保护访问的一些其他后果,请参阅有关此主题的文章。我在这个主题上撰写的最密切关系的文章是this one和this one。我在相关主题here上写了更多文章(尽管其中一些文章偏离了受保护访问本身的主题,并涉及如何使用受保护访问来构建具有父引用的数据模型的主题。 )
答案 1 :(得分:2)
您尚未正确设置代码。类B
不应具有类A
的实例。相反,类B
本身会继承类A
中的受保护变量。
您的代码应该更像:
class A
{
protected int Test;
}
class B:A
{
public B()
{
int someInt = this.Test;
}
}
答案 2 :(得分:2)
您可以访问Test
类中的B
int。但是,您无法访问实例的属性。 A
不知道它是B
的孩子,因此不会访问其财产。
class A
{
protected int Test;
}
class B : A
{
public B()
{
Test = 3; //possible
base.Test = 3; //explicitly calling base member, but not necessary in this case
}
}
答案 3 :(得分:2)
子类可以访问标记为protected
的他们自己的继承成员。
class A
{
protected int Test;
}
class B : A
{
public B()
{
this.Test = 42; // Possible
}
}
答案 4 :(得分:2)
由于B
已经从A
继承,因此您不需要A
的单独实例。
public B()
{
this.Test = 1; //possible
}
答案 5 :(得分:2)
您可以通过同一个类访问它,而不是基类的公共成员。
class A
{
protected int Test;
}
class B:A
{
void TestMethod()
{
this.Test = 3; // Possible
}
}
在C#中检查protected访问修饰符。
答案 6 :(得分:2)
如果您继承A
,则无需创建A
的实例。
class A
{
protected int Test;
}
class B:A
{
public B()
{
this.Test = 666;
}
}