gpt4 book ai didi

c# - c# 中继承和接口(interface)的意外行为

转载 作者:行者123 更新时间:2023-11-30 19:22:47 24 4
gpt4 key购买 nike

今天,在用 C# 实现一些测试类时,我遇到了一些关于 C# 中的继承(和接口(interface))的问题。下面我有一些示例代码来说明我的问题。

interface ILuftfahrzeug
{
void Starten();
}

class Flugzeug : ILuftfahrzeug
{
public void Starten()
{
Console.WriteLine("Das Flugzeug startet, "+Dings());
}

protected string Dings()
{
return "Flugzeug Dings";
}
}


class Motorflugzeug : Flugzeug, ILuftfahrzeug
{
public new void Starten()
{
Console.WriteLine("Das Motorflugzeug startet, "+Dings());
}

protected new string Dings()
{
return "Motorflugzeug Dings";
}
}

class InterfaceUndVererbung
{
static void Main(string[] args)
{
//Motorflugzeug flg = new Motorflugzeug(); // case1: returns "Das Motorflugzeug startet, Motorflugzeug Dings"
//Flugzeug flg = new Motorflugzeug(); // case2: returns "Das Flugzeug startet, Flugzeug Dings"
ILuftfahrzeug flg = new Motorflugzeug(); // case3: returns "Das Motorflugzeug startet, Motorflugzeug Dings"
// if Motorflugzeug implements ILuftfahrzeug explicitly,
// otherwise "Das Motorflugzeug startet, Motorflugzeug Dings"

flg.Starten();
Console.ReadLine();
}
}

这些是我的问题:

  1. 使用 Flugzeug flg = new Motorflugzeug() 声明和初始化; (case2) 我预计会调用 Motorflugzeug.Starten 而不是 Flugzeug.Starten(而且我很确定这是 Java 显示的行为)。 openbook.galileo 说在那种情况下使用 c# 运行时类型是 Flugzeug。有什么理由吗?对我来说,这种继承行为毫无意义。
  2. 与 ILuftfahrzeug 相同 flg = new Motorflugzeug(); (case3) - 在这里我可以通过让 Motorflugzeug 显式实现 ILuftfahrzeug 来解决问题(就像在示例代码中一样)。但对我来说这是多余的,因为 Flugzeug 已经实现了 ILuftfahrzeug。
  3. 现在我想覆盖由 Starten() 调用的 protected 方法 Dings()。如果我运行示例中实现的代码,一切正常。但是如果 Starten() 没有在 Motorflugzeug 中实现,基类的 Dings() 将被调用而不是 Motorflugzeug.Dings()。有人告诉我,Java 也表现出这种行为。
    有什么模式可以解决这个问题吗?否则,我将不得不覆盖所有调用我实际打算覆盖的方法(此处:Dings())的方法(此处:Starten()),即使它与基类中的方法完全相同。

最佳答案

1:您正在重新声明该方法 (new);如果您 override 它应该可以工作。 new 打破了任何多态行为。

2:您正在重新实现界面;这确实叫最高执行。同样,override 会解决这个问题。

class Flugzeug : ILuftfahrzeug {
public virtual void Starten() {
Console.WriteLine("Das Flugzeug startet, " + Dings());
}
protected virtual string Dings() {
return "Flugzeug Dings";
}
}
class Motorflugzeug : Flugzeug {
public override void Starten() {
Console.WriteLine("Das Motorflugzeug startet, " + Dings());
}
protected override string Dings() {
return "Motorflugzeug Dings";
}
}

关于c# - c# 中继承和接口(interface)的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/607848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com