代码之家  ›  专栏  ›  技术社区  ›  Diones

如何重写泛型方法?C

  •  3
  • Diones  · 技术社区  · 16 年前

    TetraQueue System.Collections.Generic.Queue 类覆盖 Dequeue 方法,下面是代码:

    public class TetraQueue : Queue<Tetrablock>
    {
       public override Tetrablock Dequeue()
       {
           return base.Dequeue();
       }
     }
    

    但当我尝试编译这个时,我得到:

    提前感谢。

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

    7 回复  |  直到 12 年前
        1
  •  3
  •   Andrew Hare    16 年前

    编辑:其他人建议隐藏该方法。我强烈建议你 do not 的常用口语形式 除非你真的、真的必须这样做。这会导致调试会话困难和继承时的沮丧 出现

        2
  •  9
  •   Jon Skeet    16 年前

    Dequeue 方法不是虚拟的,所以您不能重写它。

        3
  •  5
  •   Nick Berardi    16 年前

    public class TetraQueque : Queue<Tetrablock>
    {
       public new Tetrablock Dequeque()
       {
           return base.Dequeue();
       }
    }
    
        4
  •  1
  •   Gerrie Schenck    16 年前

    添加new关键字以隐藏基类上的方法。

    一篇关于.net中多态性的好文章: http://www.akadia.com/services/dotnet_polymorphism.html

        5
  •  1
  •   Davy Landman    16 年前

    队列中没有Deque ue方法,但Dequeue方法。这将是第一个编译错误,如果你修复了它,你仍然无法编译,因为它不是一个虚拟方法。

    使用new关键字,您可以重新引入此方法,但请记住正确拼写函数名称,否则将出现 .Dequeue 以及a .Dequeque 方法。

        6
  •  1
  •   senfo    16 年前

    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!
        7
  •  1
  •   Pete Kirkham    16 年前