我最近做的一个 C# MTA 考试的问题引起了很多讨论:
您有一个名为 Glass 的类,它继承自名为 Window 的基类。Window 类包括一个名为 break() 的受保护方法。
您应该如何调用 Glass 类的 break() 方法实现?
A. Window.break();
B. Glass.break();
C.this.break();
D.base.break();
谁能给我一个可靠的答案和合理的答案?
我最近做的一个 C# MTA 考试的问题引起了很多讨论:
您有一个名为 Glass 的类,它继承自名为 Window 的基类。Window 类包括一个名为 break() 的受保护方法。
您应该如何调用 Glass 类的 break() 方法实现?
A. Window.break();
B. Glass.break();
C.this.break();
D.base.break();
谁能给我一个可靠的答案和合理的答案?
我会通过简单地调用来做到这一点Break();
,只要该Break()
方法未声明为virtual
(这使得可以覆盖它)。this
使用or调用base
只是多余的。
但是,假设Break()
它将被声明为虚拟,那么如果您想Break()
在 Window 类 ( base.Break()
) 或 Glass 类 ( 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();
}
}
调用DoSomething()
实例时的输出Glass
将是
Break in Glass called
Break in Glass called
Break in window called
问题:
您应该如何调用 Glass 类的 break() 方法实现?
例子
在这个例子中,他们有一个名为 的类Glass
。Break()
这个类有一个来自基类的调用方法Window
。
他们希望您在Glass class
“调用break()方法的Glass类实现”中调用实现的方法
要创建自己的基类方法版本,您需要使其可重写。为此,将 virtual 添加到基类方法中,并在派生类中Glass
添加 override 以覆盖该基类方法。]
接下来可以调用不同版本的方法,派生方法和基方法。有关更多详细信息,请参见示例
此示例将如下所示:
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();
}
}
回答:
这个答案是正确的,因为这个调用了当前实例Glass class Break() method
(参见示例)
C: this.break();
其他答案:
这Break()
不是静态的,因为这没有任何意义,也不能在这个问题中变成静态的。他们希望 Glass 继承自 Window 并希望调用Break()
Glass 类的版本。您需要Break()
在 Glass 类中重写以创建该方法的自己版本,因此您需要添加 virtual 和 override 并且 virtual/override 方法不能设为静态。因为前两个答案不正确
一个 Window.Break()
这将从 Window 类调用静态 Break() 方法。(此示例中未使用静态这不是答案)
B Glass.Break()
这将从类中调用静态 Break() 方法。(此示例中未使用静态,这不是答案)
C this.Break()
这将调用当前实例的 Break() 方法(参见示例)。
D base.Break()
这将从基类 Window 的当前实例调用 Break() 方法。
B. Glass.break();
它没有在调用它的任务中指定,所以由于应该只有 1 个正确的解决方案,唯一合乎逻辑的方法是假设它可以从任何地方调用。因此,如果我们将 break()实现为公共静态方法,我们将能够从任何地方调用它,而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()是行不通的,这实际上让整个任务变得毫无意义。