【发布时间】:2011-08-04 00:36:53
【问题描述】:
我读到可以从派生类访问受保护的成员,但以下不起作用。
class A
{
protected int Test;
}
class B:A
{
A instanceOfA= new A()
public B()
{
instanceOfA.Test //Not possible
}
}
【问题讨论】:
我读到可以从派生类访问受保护的成员,但以下不起作用。
class A
{
protected int Test;
}
class B:A
{
A instanceOfA= new A()
public B()
{
instanceOfA.Test //Not possible
}
}
【问题讨论】:
我读到可以从派生类访问受保护的成员。为什么我对“受保护”的使用不起作用?
这是非法的,因为您没有保证您正在访问“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,因此 SwissBankAccount 的受保护成员不允许在 EvilBankAccount 内部使用。您可以访问“父母”的受保护成员,但不能访问“兄弟姐妹”! EvilBankAccount 只能访问EvilBankAccount(或从 EvilBankAccount 派生的类型)的受保护成员。 SwissBankAccount 的受保护成员不受限制。
规则是通过访问受保护实例成员的“接收者”表达式的类型必须至少与类型声明包含会员访问。有关规则的准确措辞和一些说明性示例,请参阅 C# 4.0 规范的第 3.5.3 节。
顺便说一句,C++ 也有这个规则。
这条规则经常被误解。有关此规则和受保护访问的其他一些后果的更深入分析,请参阅我关于该主题的文章。我在这个主题上写的最贴切的文章是this one 和this one。我写了很多关于相关主题here 的文章(尽管其中一些文章偏离了受保护访问本身的主题,而转向了如何使用受保护访问来构建具有父引用的数据模型的主题。)
【讨论】:
如果继承A,则无需创建A 的实例。
class A
{
protected int Test;
}
class B:A
{
public B()
{
this.Test = 666;
}
}
【讨论】:
子类可以访问它们自己的被标记为protected的继承成员。
class A
{
protected int Test;
}
class B : A
{
public B()
{
this.Test = 42; // Possible
}
}
【讨论】:
您可以通过同一个类访问它,而不是作为基类的公共成员。
class A
{
protected int Test;
}
class B:A
{
void TestMethod()
{
this.Test = 3; // Possible
}
}
在 C# 中检查 protected 访问修饰符。
【讨论】:
由于B 已经从A 继承,您不需要A 的单独实例。
public B()
{
this.Test = 1; //possible
}
【讨论】:
您可以在B 类本身中访问Test 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
}
}
【讨论】:
您的代码设置不正确。 B 类不应有 A 类的实例。相反,B 类本身继承了A 类的受保护变量。
您的代码应该看起来更像:
class A
{
protected int Test;
}
class B:A
{
public B()
{
int someInt = this.Test;
}
}
【讨论】: