来自 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
(这样就可以覆盖它)。使用 this
或 base
调用是多余的。
但是假设 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() 是行不通的,这实际上让整个任务变得毫无意义。
最近做的一个C# MTA考试题,引起了很大的讨论:
您有一个名为 class 的 Glass,它继承自一个名为 Window 的基 class。 Window class 包含一个名为 break() 的受保护方法。
您应该如何调用 Glass class 方法的 break() 实现?
一个。 Window.break();
乙。 Glass.break();
摄氏度。 this.break();
D. base.break();
有人能给我一个可靠的答案吗?
我会通过简单地调用 Break();
来做到这一点,只要 Break()
方法没有声明为 virtual
(这样就可以覆盖它)。使用 this
或 base
调用是多余的。
但是假设 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() 是行不通的,这实际上让整个任务变得毫无意义。