我读过受保护的成员可以从派生类中访问,但以下代码不起作用。
class A
{
protected int Test;
}
class B:A
{
A instanceOfA= new A()
public B()
{
instanceOfA.Test //Not possible
}
}
我已经阅读了受保护成员可以从派生类中访问的内容。为什么我的“protected”使用不起作用?
这是非法的,因为您没有提供访问“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;
}
}
这个规则经常被误解。想要更深入地了解这个规则以及protected访问修饰符的其他后果,请参阅我关于此主题的文章。我写过的与此主题最相关的文章是这篇和这篇。我还写了一堆关于相关主题的文章在这里(尽管其中一些偏离了protected访问本身的主题,而是涉及如何使用protected访问修饰符构建具有父引用的数据模型)。
您的代码设置不正确。类 B
不应该有一个类 A
的实例。相反,类 B
本身继承了类 A
的受保护变量。
您的代码应该更像这样:
class A
{
protected int Test;
}
class B:A
{
public B()
{
int someInt = this.Test;
}
}
您可以在 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
}
}
子类可以访问被标记为protected
的自己的继承成员。
class A
{
protected int Test;
}
class B : A
{
public B()
{
this.Test = 42; // Possible
}
}
B
已经继承了A
,因此您不需要一个单独的A
实例。 public B()
{
this.Test = 1; //possible
}
class A
{
protected int Test;
}
class B:A
{
void TestMethod()
{
this.Test = 3; // Possible
}
}
查看C#中的protected访问修饰符。
如果你继承了A
,那么你不需要创建一个A
实例。
class A
{
protected int Test;
}
class B:A
{
public B()
{
this.Test = 666;
}
}