代码之家  ›  专栏  ›  技术社区  ›  John V

方法擦除:为什么说派生类方法隐藏了基类,但实际上是相反的呢?

  •  0
  • John V  · 技术社区  · 6 年前
    class Animal
    {
        public void Foo() { Console.WriteLine("Animal::Foo()"); }
    }
    
    class Cat : Animal
    {
        public void Foo() { Console.WriteLine("Cat::Foo()"); }
    }
    
    class Test
    {
        static void Main(string[] args)
        {
            Animal a;
    
            a = new Cat();
            a.Foo();  // output --> "Animal::Foo()"
        }
    }
    

    编译器警告说:

    Foo隐藏继承的成员

    5 回复  |  直到 5 年前
        1
  •  1
  •   Zohar Peled    6 年前

    程序的输出是 Animal 的类实现 Foo 动物 而不是 Cat .

    如果引用的类型为 "Cat::Foo()" .

    这个 方法 类正在隐藏 方法 动物 因为基类不能也不应该知道它们的派生类,而派生类是并且必须知道它们的基类。

    要故意隐藏基类的成员,请使用 new 修饰语。这将告诉编译器隐藏是故意的,并将抑制警告。

        2
  •  0
  •   Hary    6 年前

    Overrided 在派生类中。检查 Virtual 还有 Override

    This 也许对你有帮助。

    class Animal
    {
        public virtual void Foo() { Console.WriteLine("Animal::Foo()"); }
    }
    
    class Cat : Animal
    {
        public override void Foo() { Console.WriteLine("Cat::Foo()"); }
    }
    
    class Test
    {
        static void Main(string[] args)
        {
            Animal a;
    
            a = new Cat();
            a.Foo();  // output --> "Cat::Foo()"
        }
    }
    
        3
  •  0
  •   Thomas Hilbert    6 年前

    a

    Cat c = new Cat();
    Animal a = c; // note: a and c refer to the same object
    
    a.Foo(); // output --> "Animal::Foo()"
    c.Foo(); // output --> "Cat::Foo()"
    

    从示例中可以看出,当涉及隐藏时,结果取决于引用类型,而不是对象类型。

        4
  •  -1
  •   Hossein Golshani    6 年前

    polymorphism Foo() 在基类和 override 它在子类中是这样的:

    class Animal
    {
        public virtual void Foo() { Console.WriteLine("Animal::Foo()"); }
    }
    
    class Cat : Animal
    {
        public override void Foo() { Console.WriteLine("Cat::Foo()"); }
    }
    
    class Test
    {
        static void Main(string[] args)
        {
            Animal a;
    
            a = new Cat();
            a.Foo();  // output --> "Cat::Foo()"
        }
    }
    

    Foo() 有多态行为!