繁体   English   中英

如何覆盖通用方法?(C#)

[英]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

提前致谢。

我怎么知道一个方法是否是虚拟的(避免这种情况)?

知道方法是否为虚拟的两种方法:

  • 在Visual Studio中输入“覆盖”,它将为您提供所有允许覆盖的方法。
  • 查看文档 -出队不是说它是虚拟的,因此您不能覆盖它。

编辑:其他人建议隐藏该方法。 我强烈建议您除非确实需要,否则要这样做。 当继承似乎有时起作用而有时不起作用时,这是一个困难的调试会话和挫败感的良方,具体取决于引用的编译时类型。 模糊。 如果您不打算专门研究行为,请使用合成代替继承。

您必须使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM