如何访问 Derived 1 和 Derived 2 中的结果而不是基础 class
How can I access the result in Derived 1 and Derived 2 and not the base class
class Baseclass
{
public void fun()
{
Console.Write("Base class" + " ");
}
}
class Derived1 : Baseclass
{
new void fun()
{
Console.Write("Derived1 class" + " ");
}
}
class Derived2 : Derived1
{
new void fun()
{
Console.Write("Derived2 class" + " ");
}
}
class Program
{
public static void Main(string[] args)
{
Derived2 d = new Derived2();
Derived1 e = new Derived1();
d.fun();
e.fun();
}
}
如何访问 Derived 1 和 Derived 2 中的结果而不是基数 class
这是重载还是覆盖?
new
既不是重载也不是覆盖。它本质上说 'When I am called, and the object is cast as Derived1
, then invoke this'。请注意,它是 对象被施放的时候,而不是对象与之交互的时候。
如果您将方法标记为 public
,您的代码将 看起来 可以工作。例如:
class Derived1 : Baseclass
{
public new void fun()
{
Console.Write("Derived1 class" + " ");
}
}
class Derived2 : Derived1
{
public new void fun()
{
Console.Write("Derived2 class" + " ");
}
}
将打印
Derived2 class Derived1 class
但是,将您的代码更改为以下内容将揭示 new
在这种情况下的问题:
void Main()
{
Derived2 d = new Derived2();
Derived1 e = new Derived1();
ExecuteIt(d);
ExecuteIt(e);
}
void ExecuteIt(Baseclass obj)
{
obj.fun();
}
打印
Base class Base class
由于对象被转换为Baseclass
,因此隐藏不生效。要正确实现覆盖,您需要执行以下操作:
class Baseclass
{
public virtual void fun()
// ^^^^^^^
{
Console.Write("Base class" + " ");
}
}
class Derived1 : Baseclass
{
public override void fun()
// ^^^^^^ ^^^^^^^^
{
Console.Write("Derived1 class" + " ");
}
}
class Derived2 : Derived1
{
public override void fun()
// ^^^^^^ ^^^^^^^^
{
Console.Write("Derived2 class" + " ");
}
}
其中,当 运行 具有:
void Main()
{
Derived2 d = new Derived2();
Derived1 e = new Derived1();
ExecuteIt(d);
ExecuteIt(e);
}
void ExecuteIt(Baseclass obj)
{
obj.fun();
}
正确输出
Derived2 class Derived1 class
class Baseclass
{
public void fun()
{
Console.Write("Base class" + " ");
}
}
class Derived1 : Baseclass
{
new void fun()
{
Console.Write("Derived1 class" + " ");
}
}
class Derived2 : Derived1
{
new void fun()
{
Console.Write("Derived2 class" + " ");
}
}
class Program
{
public static void Main(string[] args)
{
Derived2 d = new Derived2();
Derived1 e = new Derived1();
d.fun();
e.fun();
}
}
如何访问 Derived 1 和 Derived 2 中的结果而不是基数 class 这是重载还是覆盖?
new
既不是重载也不是覆盖。它本质上说 'When I am called, and the object is cast as Derived1
, then invoke this'。请注意,它是 对象被施放的时候,而不是对象与之交互的时候。
如果您将方法标记为 public
,您的代码将 看起来 可以工作。例如:
class Derived1 : Baseclass
{
public new void fun()
{
Console.Write("Derived1 class" + " ");
}
}
class Derived2 : Derived1
{
public new void fun()
{
Console.Write("Derived2 class" + " ");
}
}
将打印
Derived2 class Derived1 class
但是,将您的代码更改为以下内容将揭示 new
在这种情况下的问题:
void Main()
{
Derived2 d = new Derived2();
Derived1 e = new Derived1();
ExecuteIt(d);
ExecuteIt(e);
}
void ExecuteIt(Baseclass obj)
{
obj.fun();
}
打印
Base class Base class
由于对象被转换为Baseclass
,因此隐藏不生效。要正确实现覆盖,您需要执行以下操作:
class Baseclass
{
public virtual void fun()
// ^^^^^^^
{
Console.Write("Base class" + " ");
}
}
class Derived1 : Baseclass
{
public override void fun()
// ^^^^^^ ^^^^^^^^
{
Console.Write("Derived1 class" + " ");
}
}
class Derived2 : Derived1
{
public override void fun()
// ^^^^^^ ^^^^^^^^
{
Console.Write("Derived2 class" + " ");
}
}
其中,当 运行 具有:
void Main()
{
Derived2 d = new Derived2();
Derived1 e = new Derived1();
ExecuteIt(d);
ExecuteIt(e);
}
void ExecuteIt(Baseclass obj)
{
obj.fun();
}
正确输出
Derived2 class Derived1 class