来自 MTA 的 C# 继承讨论

C# Inheritance Discussion from MTA

最近做的一个C# MTA考试题,引起了很大的讨论:

您有一个名为 class 的 Glass,它继承自一个名为 Window 的基 class。 Window class 包含一个名为 break() 的受保护方法。

您应该如何调用 Glass class 方法的 break() 实现?

一个。 Window.break();
乙。 Glass.break();
摄氏度。 this.break();
D. base.break();

有人能给我一个可靠的答案吗?

我会通过简单地调用 Break(); 来做到这一点,只要 Break() 方法没有声明为 virtual(这样就可以覆盖它)。使用 thisbase 调用是多余的。

但是假设 Break() 将被声明为虚拟的,那么如果您想在 Window [=32] 上调用 Break() 的实现,这将是一个问题=] (base.Break()) 或在玻璃上 class (Break()/this.Break()).

考虑以下代码

public class Window
{
    public virtual void Break()
    {
        Console.WriteLine("Break in window called");
    }
}

public class Glass : Window
{
    public override void Break()
    {
        Console.WriteLine("Break in Glass called");
    }

    public void DoSomething()
    {
        Break();
        this.Break(); // Same as above line
        base.Break();
    }
}

Glass 的实例上调用 DoSomething() 时的输出将是

Break in Glass called
Break in Glass called
Break in window called

Question:

你应该如何调用 Glass class 方法的 break() 实现?

Example

在这个例子中,他们有一个名为 Glass 的 class。这个 class 有一个名为 Break() 的方法,它来自基础 class Window

他们要你调用 Glass class "call the Glass class implementation of the break() method"

中实现的方法

要创建自己的基础 class 方法版本,您需要将其设置为可写。为此,将 virtual 添加到基础 class 方法,并在派生的 class Glass 中添加 override 以覆盖该基础 class 方法。]

接下来可以调用不同版本的方法派生方法和基方法。有关详细信息,请参见示例

这个例子看起来像这样:

 class Window
 {
     public virtual void Break()
     {
           // break method from the window class 
     }
 }

 class Glass : Window
 {
     public override void Break()
     {
           // This method comes from the base class Window. You want to override this one. They ask you to call this method.

           //To call the Break() mehod from Window:
           base.Break();
           // Call the Break() method from the current instance
           this.Break()
           Break(); 
     }
 }

Answer:

这个答案是正确的,因为这个从 Glass class Break() method 调用当前实例(参见示例)

C: this.break();

Other answers:

Break() 不是静态的,因为这没有任何意义,也不能在这个问题中设为静态。他们希望 Glass 继承自 Window,并希望调用 Break() 版本的 Glass class。您需要重写 Glass class 中的 Break() 以创建该方法的自己版本,因此您需要添加虚拟和重写并且 virtual/override 方法不能设为静态。因此,前两个答案不正确

A Window.Break()

这将从 Window class 调用静态 Break() 方法。 (此示例中未使用静态这不是答案)

B Glass.Break()

这将从 class 调用静态 Break() 方法。 (此示例中未使用静态,这不是答案)

C this.Break()

这将调用当前实例的 Break() 方法(参见示例)。

D base.Break()

这将从基 class Window.

的当前实例调用 Break() 方法

乙。 Glass.break();

它没有在调用它的任务中指定,所以由于应该只有 1 个正确的解决方案,唯一合乎逻辑的方法是假设它可以从任何地方调用。因此,如果我们将 break() 实现为 public static 方法,我们将能够从任何地方调用它 B 将是唯一合乎逻辑且可能的答案。

using System;
public class Window{
    protected void break1() {Console.Write("1");}
    public Window(){
        Glass.break1();
    }
}
public class Glass : Window{
    public static void break1() {Console.Write("2");}
    public Glass() {
        Glass.break1();
    }
}
public class Dijete : Glass{
    public Dijete() {
        Glass.break1();
    }
}
public class Program
{
    public static void Main()
    {
        Glass.break1();
    }
}

如果我错了请纠正我的逻辑,但在考试转储中我也发现 B 是正确答案。

PS: 我把它命名为 break1,因为调用它 break() 是行不通的,这实际上让整个任务变得毫无意义。