C# 通过在基类成员中创建的派生类对象…访问继承的私有基类成员
如果x和y是私有的,我无法理解为什么类a中的m()可以通过b类和b类对象访问x和y。我知道当b从a继承时,b从a接收私有成员,即使它们不能被b使用。但令我感到奇怪的是,b成员不能使用x和y,除a以外的类不能通过b类和b类对象获取变量,而m()可以通过b类和b类对象访问x和y 有人能用我错过的一般规则来解释这一点吗?或者,有人能解释一下编译器是如何将基成员“给予”给派生类的吗C# 通过在基类成员中创建的派生类对象…访问继承的私有基类成员,c#,inheritance,C#,Inheritance,如果x和y是私有的,我无法理解为什么类a中的m()可以通过b类和b类对象访问x和y。我知道当b从a继承时,b从a接收私有成员,即使它们不能被b使用。但令我感到奇怪的是,b成员不能使用x和y,除a以外的类不能通过b类和b类对象获取变量,而m()可以通过b类和b类对象访问x和y 有人能用我错过的一般规则来解释这一点吗?或者,有人能解释一下编译器是如何将基成员“给予”给派生类的吗 class a { private int x; private static int y; s
class a
{
private int x;
private static int y;
static void m()
{
b bobj = new b();
int mm = bobj.x;
int rr = b.y;
}
void n()
{
b bobj = new b();
int mm = bobj.x;
int rr = b.y;
}
}
class b : a
{
private int u;
private static int v;
static void o()
{
}
void p()
{
}
}
如果x和y是私有的,我无法理解为什么类a中的m()可以通过b类和b类对象访问x和y
类声明中的代码可以访问该类声明的任何私有成员——就这么简单。因此a
中的代码无法访问b
中声明的私有变量,但它可以通过a
的实例访问a
中声明的私有变量,该实例恰好也是b
的实例
请注意,这一行:
int rr = b.y;
有效地转化为
int rr = a.y;
y
仅由a
声明-如果它确实是由b
声明的,它将无法访问
有关更多详细信息,请参见C#4语言规范的第3.5节
如果x和y是私有的,我无法理解为什么类a中的m()可以通过b类和b类对象访问x和y
类声明中的代码可以访问该类声明的任何私有成员——就这么简单。因此a
中的代码无法访问b
中声明的私有变量,但它可以通过a
的实例访问a
中声明的私有变量,该实例恰好也是b
的实例
请注意,这一行:
int rr = b.y;
有效地转化为
int rr = a.y;
y
仅由a
声明-如果它确实是由b
声明的,它将无法访问
参见C 4语言规范的第3.5部分,详细说明。
< P>这是从C++语言继承的规则。< /P>private
和protected
对类而不是对象进行操作。因此,例如,如果您有一个银行
对象,其成员可以访问任何其他银行
的私人数据,尽管这可能看起来违反直觉或危险
<>因为C++广泛使用指针运算和无限类型,所以在同一进程中执行任何代码之前,没有可靠的方法来保护进程内的数据。p>
但是,如果您只需要对象级别的保护以防止意外访问,那么可以通过定义接口和仅在银行之间传递接口来帮助实现这一点。而银行
对象仍可以执行以下操作:
void TransferMoneyFrom(IBank otherBank, decimal theirAccountNumber,
decimal receivingAccountNumber, int amount)
{
((Bank)otherBank).PrivateProperty = whatever;
}
…由于需要显式类型转换或使用反射,因此不太可能意外发生
(请注意,C#通常会使您更容易有意地访问某个其他类的私有成员,而您没有该类的源代码(通过名称,使用反射)如果这种类型的供应商认为这是一个不利因素,他们可以使用混淆器来使这更困难。这仍然不能保护混淆对象以任何方式来保护其他实例。) < P>这是从C++语言继承的规则。
private
和protected
对类而不是对象进行操作。因此,例如,如果您有一个银行
对象,其成员可以访问任何其他银行
的私人数据,尽管这可能看起来违反直觉或危险
<>因为C++广泛使用指针运算和无限类型,所以在同一进程中执行任何代码之前,没有可靠的方法来保护进程内的数据。p>
但是,如果您只需要对象级别的保护以防止意外访问,那么可以通过定义接口和仅在银行之间传递接口来帮助实现这一点。而银行
对象仍可以执行以下操作:
void TransferMoneyFrom(IBank otherBank, decimal theirAccountNumber,
decimal receivingAccountNumber, int amount)
{
((Bank)otherBank).PrivateProperty = whatever;
}
…由于需要显式类型转换或使用反射,因此不太可能意外发生
(请注意,C#通常会使您更容易有意地访问某个其他类的私有成员,而您没有该类的源代码(通过名称,使用反射)。如果该类型的供应商认为这是一个缺点,他们可以使用模糊器使其更加困难。这仍然无法保护模糊对象以任何方式对抗其自身的其他实例。)不确定问题出在何处
x
和y
仅在a
的成员内部或由其访问,即使它们是由基类继承和使用的。不确定问题出在哪里x
和y
仅在a
的成员内部或由其访问,即使它们是由基类继承和使用的。@MareInfinitus:base.b
没有任何意义-b
是类型名。我建议你写你想检查它是否真的有意义的代码…就在这里!斯基特先生的回答恰到好处。谢谢大家@MareInfinitus:但是当您尝试使用bobj
时,这些将无效当然…@MareInfinitus:base.b
没有任何意义-b
是类型名称。我建议你写你想检查它是否真的有意义的代码…就在这里!斯基特先生的回答恰到好处。谢谢大家@MareInfinitus:但是当你试图使用bobj
时,这些是无效的。。。