[英]How do I override an generic method?(C#)
我正在创建一个名为TetraQueue
的类,该类继承了覆盖Dequeue
方法的System.Collections.Generic.Queue
类,下面是代码:
public class TetraQueue : Queue<Tetrablock>
{
public override Tetrablock Dequeue()
{
return base.Dequeue();
}
}
但是当我尝试编译时,我得到:
错误TetraQueue.Dequeue()':找不到合适的方法来覆盖TetraQueue.cs
提前致谢。
我怎么知道一个方法是否是虚拟的(避免这种情况)?
知道方法是否为虚拟的两种方法:
编辑:其他人建议隐藏该方法。 我强烈建议您除非确实需要,否则不要这样做。 当继承似乎有时起作用而有时不起作用时,这是一个困难的调试会话和挫败感的良方,具体取决于引用的编译时类型。 模糊。 如果您不打算专门研究行为,请使用合成代替继承。
您必须使用new关键字。 这将告诉编译器您希望将此方法置于另一个方法之上。 不过只是警告,如果您使用的是Queue之类的基类,则将无法使用此新方法。
public class TetraQueque : Queue<Tetrablock>
{
public new Tetrablock Dequeque()
{
return base.Dequeue();
}
}
不幸的是, Dequeue
方法不是虚拟的,因此您无法覆盖它。
添加新关键字以隐藏基类上的方法。
有关.net中多态性的好文章: http : //www.akadia.com/services/dotnet_polymorphism.html
队列不具有的Deque q UE的方法,但一个出列方法。 那将是第一个编译错误,如果您修复此错误,由于它不是虚拟方法,因此仍然无法编译。
使用new关键字可以重新引入此方法,但请记住正确拼写函数名称,否则将出现.Dequeue
和.Dequeque
方法。
问题本身也包含此拼写错误。
覆盖仅调用父方法的方法是没有意义的,因此,如果您发布的代码只是您正在做的事情,则不要覆盖它。
通过将TetraQueue设置为Queue <TetraBlock>,您说的是只要可以使用Queue <TetraBlock>,就可以使用它。 通过向其添加一个新方法,如果调用者知道其TetraQueue,则该方法将隐藏原始方法,那么您将无法使用该合同。
如果我想要与Queue相同的行为,可以使用Queue <TetraBlock>; 如果我想要不同的东西,我会使用合成而不是继承。
如前所述,您不能覆盖该方法,因为它是非虚拟的。 但是,我强烈建议您不要隐藏该方法。 考虑以下:
class Program
{
static void Main(string[] args)
{
A a = new A();
B b = new B();
A c = new B();
// Straight A
a.MyVirtualMethod();
a.MyNonVirtualMethod();
// Straight B
b.MyVirtualMethod();
b.MyNonVirtualMethod();
// Polymorphic
c.MyVirtualMethod();
c.MyNonVirtualMethod();
Console.ReadLine();
}
}
public class A
{
public virtual void MyVirtualMethod()
{
Console.WriteLine("Hello world!");
}
public void MyNonVirtualMethod()
{
Console.WriteLine("Hello world!");
}
}
public class B : A
{
public override void MyVirtualMethod()
{
Console.WriteLine("Good bye universe!");
}
public new void MyNonVirtualMethod()
{
Console.WriteLine("Good bye universe!");
}
}
对于不了解实现的人来说,此代码的输出并不明显。
Hello world! Hello world! Good bye universe! Good bye universe! Good bye universe! Hello world!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.