0

我最近做的一个 C# MTA 考试的问题引起了很多讨论:

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

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

A. Window.break();
B. Glass.break();
C.this.break();
D.base.break();

谁能给我一个可靠的答案和合理的答案?

4

3 回答 3

1

我会通过简单地调用来做到这一点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
于 2017-04-26T09:38:55.970 回答
0

问题:

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

例子

在这个例子中,他们有一个名为 的类GlassBreak()这个类有一个来自基类的调用方法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() 方法。

于 2017-04-26T09:48:59.543 回答
-1

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()是行不通的,这实际上让整个任务变得毫无意义。

于 2019-03-16T13:13:04.353 回答