【发布时间】:2014-01-04 10:00:21
【问题描述】:
我是 C# 新手(来自 C++)
我可以将方法声明为
virtual和override吗?(在 C++ 中,该方法在基类和派生类中也可以是虚拟的)我的课本中关于
new方法关键字的解释说:
有时您可能希望创建自己的基类中存在的方法的实现。 Line 类通过声明其 自己的 print() 方法。 Line print() 方法隐藏了 DrawingObject 打印()方法。效果是Parent print() 方法不会 调用,除非我们做一些特殊的事情来确保它被调用。 注意 Line 类 print() 方法上的 new 修饰符。这使 此方法隐藏 DrawingObject 类的 print() 方法和 明确说明您不希望多态性的意图 发生。如果没有 new 修饰符,编译器将产生警告 提醒您注意这一点。
如果它有什么影响?
- 基类方法是虚的,派生的是新的?
- 基类方法不是虚的,派生的是新的?
- 如果我不对派生类中的方法使用 new 关键字会发生什么
- 如果方法在基类中不是虚方法,多态性如何发生?
- 为什么“没有 new 修饰符,编译器会产生警告”?
问题参考以下代码。
using System;
public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
public new void print()
{
base.print();
Console.WriteLine("I'm a Child Class.");
}
}
public class Circle : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Circle.");
}
}
public class Square : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Square.");
}
}
【问题讨论】:
-
这不是 C++ 问题,所以我删除了那个标签。
-
对于问题1-3,只需创建这样一个程序并尝试一下。你可以很容易地观察结果。你甚至已经有了代码,所以,只需执行你拥有的代码。
-
至于方法隐藏与覆盖你可以看这篇文章:stackoverflow.com/questions/1170158/c-sharp-and-method-hiding
标签: c# inheritance polymorphism virtual-functions