C#多重继承,使用保护成员
C# multiple inheritance, using protected member
我在使用继承方面没有什么问题。当 class C 中的 first 和 second 受到保护时,我既不能更改它们的值,也不能更改 class B 中的 first 的值。如果这些变量是 public 一切正常,但在这种情况下使用 protected 有什么意义?
class A
{
protected int first { get; set; }
}
class B : A
{
protected int second { get; set; }
public Show()
{
A a = new A();
a.first = 5;
}
}
class C : B
{
private int third { get; set; }
static void Main()
{
B b = new B();
b.first = 1;
b.second = 2;
}
}
主要问题仅仅是因为您将程序的入口点放在要测试的 class 中。因为 Main()
是静态的,所以您无法访问 C
的(继承的)实例成员。
所以分开吧:
class Program
{
static void Main()
{
C c = new C();
c.Test();
}
}
您的 class C
继承自 B
,因此 C
可以像这样访问 B
的受保护成员:
class C : B
{
private int third { get; set; }
public void Test()
{
first = 1; // from A
second = 2; // from B
third = 3; // from C
}
}
通过在 C
中 new
ing 一个 B
,B
和 C
的那些实例之间没有任何关系,所以你可以在那里访问是 B
的 public
和 internal
成员。
当您处理自己的实例时,您可以访问受保护的成员 class:
class B :A
{
protected int second { get; set; }
public show() {
this.first = 5; //This is valid
}
}
如果您被允许任意访问您的基础 class' protected
成员,在基础 class 的 any 实例上,这将被允许:
class DDefinitelyNotB : A
{
}
class B :A
{
protected int second { get; set; }
public show() {
A a = new DDefinitelyNotB ();
a.first = 5;
}
}
这可能对 DDefinitelyNotB
不利,因为 other classes 恰好来自 A
能够干扰从 A
.
继承的 protected
成员
我在使用继承方面没有什么问题。当 class C 中的 first 和 second 受到保护时,我既不能更改它们的值,也不能更改 class B 中的 first 的值。如果这些变量是 public 一切正常,但在这种情况下使用 protected 有什么意义?
class A
{
protected int first { get; set; }
}
class B : A
{
protected int second { get; set; }
public Show()
{
A a = new A();
a.first = 5;
}
}
class C : B
{
private int third { get; set; }
static void Main()
{
B b = new B();
b.first = 1;
b.second = 2;
}
}
主要问题仅仅是因为您将程序的入口点放在要测试的 class 中。因为 Main()
是静态的,所以您无法访问 C
的(继承的)实例成员。
所以分开吧:
class Program
{
static void Main()
{
C c = new C();
c.Test();
}
}
您的 class C
继承自 B
,因此 C
可以像这样访问 B
的受保护成员:
class C : B
{
private int third { get; set; }
public void Test()
{
first = 1; // from A
second = 2; // from B
third = 3; // from C
}
}
通过在 C
中 new
ing 一个 B
,B
和 C
的那些实例之间没有任何关系,所以你可以在那里访问是 B
的 public
和 internal
成员。
当您处理自己的实例时,您可以访问受保护的成员 class:
class B :A
{
protected int second { get; set; }
public show() {
this.first = 5; //This is valid
}
}
如果您被允许任意访问您的基础 class' protected
成员,在基础 class 的 any 实例上,这将被允许:
class DDefinitelyNotB : A
{
}
class B :A
{
protected int second { get; set; }
public show() {
A a = new DDefinitelyNotB ();
a.first = 5;
}
}
这可能对 DDefinitelyNotB
不利,因为 other classes 恰好来自 A
能够干扰从 A
.
protected
成员