为什么在没有覆盖产生警告并进行覆盖时覆盖关键字会产生错误?
Why override keyword produces error when no override produces warning and do overriding?
下面的代码产生错误,无法编译。但是当我们删除 override
关键字时,它只会产生警告、编译甚至覆盖。
有什么合乎逻辑的解释吗?
class Baseclass
{
public void fun()
{
Console.WriteLine("Hi ");
}
public void fun(int i)
{
Console.Write("Hello ");
}
}
class Derived : Baseclass
{
public override void fun()
{
Console.Write("Bye ");
}
}
class MyProgram
{
static void Main(string[] args)
{
Derived d;
d = new Derived();
d.fun();
d.fun(77);
Console.Read();
}
}
在 C# 中,您只能覆盖标记为虚拟的方法。试试这个
class Baseclass
{
public virtual void fun()
{
Console.WriteLine("Hi ");
}
}
class Derived : Baseclass
{
public override void fun()
{
Console.Write("Bye ");
}
}
当您将 override
放入函数签名中时,编译需要基 class 中不存在的匹配虚方法(签名和 return 类型),因此出现错误提出。
当您删除实际上隐藏 BaseClass
方法但不会覆盖它的覆盖关键字时。在这种情况下,编译器只会发出警告并继续编译。
覆盖和隐藏之间有一点区别请参阅Overriding vs method hiding了解更多详情
C# 包含一个关键字 virtual
,它允许您将成员标记为在派生的 classes 中被覆盖。
文档中所述的原因是:
By default, methods are non-virtual. You cannot override a non-virtual method.
为什么语言设计者要这样做,你必须明确声明一个方法可以被覆盖?我不能代表他们说话,但很明显他们想给程序员一个安全的方法来避免错误地覆盖成员。这似乎是这里最明显的胜利。
因此,在设计 class 时,您应该将 class 标记为您认为被有用地覆盖为虚拟的。
您可以在 MSDN 上阅读更多内容。
所以你的 Baseclass 看起来像这样:
class Baseclass
{
public virtual void fun()
{
Console.WriteLine("Hi ");
}
public void fun(int i)
{
Console.Write("Hello ");
}
}
当然,您也可以将 virtual
添加到采用 int 的重载方法中。
下面的代码产生错误,无法编译。但是当我们删除 override
关键字时,它只会产生警告、编译甚至覆盖。
有什么合乎逻辑的解释吗?
class Baseclass
{
public void fun()
{
Console.WriteLine("Hi ");
}
public void fun(int i)
{
Console.Write("Hello ");
}
}
class Derived : Baseclass
{
public override void fun()
{
Console.Write("Bye ");
}
}
class MyProgram
{
static void Main(string[] args)
{
Derived d;
d = new Derived();
d.fun();
d.fun(77);
Console.Read();
}
}
在 C# 中,您只能覆盖标记为虚拟的方法。试试这个
class Baseclass
{
public virtual void fun()
{
Console.WriteLine("Hi ");
}
}
class Derived : Baseclass
{
public override void fun()
{
Console.Write("Bye ");
}
}
当您将 override
放入函数签名中时,编译需要基 class 中不存在的匹配虚方法(签名和 return 类型),因此出现错误提出。
当您删除实际上隐藏 BaseClass
方法但不会覆盖它的覆盖关键字时。在这种情况下,编译器只会发出警告并继续编译。
覆盖和隐藏之间有一点区别请参阅Overriding vs method hiding了解更多详情
C# 包含一个关键字 virtual
,它允许您将成员标记为在派生的 classes 中被覆盖。
文档中所述的原因是:
By default, methods are non-virtual. You cannot override a non-virtual method.
为什么语言设计者要这样做,你必须明确声明一个方法可以被覆盖?我不能代表他们说话,但很明显他们想给程序员一个安全的方法来避免错误地覆盖成员。这似乎是这里最明显的胜利。
因此,在设计 class 时,您应该将 class 标记为您认为被有用地覆盖为虚拟的。
您可以在 MSDN 上阅读更多内容。
所以你的 Baseclass 看起来像这样:
class Baseclass
{
public virtual void fun()
{
Console.WriteLine("Hi ");
}
public void fun(int i)
{
Console.Write("Hello ");
}
}
当然,您也可以将 virtual
添加到采用 int 的重载方法中。