我可以在基本“虚拟”方法的父和祖父类中触发`override`方法[重复]

问题描述 投票:-1回答:2

这个问题在这里已有答案:

即我有2步继承类,并且只能访问Parent_1类:

public class Base
{
    public virtual void hello (){}
}

//
public class Parent_1 : Base
{
    public override void hello (){ Print("Hi 1"); }
}

public class Parent_2 : Parent_1
{ 
    public override void hello (){ Print("Hi 2");  xyz =123; } 
}

我无法访问Parent_1以外的任何代码。我想,当Parent_2hello被执行时,我的Parent_1hello也被解雇了。

我认为应该存在某种方式,所以当Parent_2被执行时,不知何故我在Parent_1得到通知(事件处理程序或其他),这不可能吗?我知道xyz在那里“改变了”,所以也许是一个“财产变化观察者”?

c# inheritance override virtual
2个回答
0
投票

Update

不幸的是,在我的情况下没有帮助,因为我既不控制代码的其他部分,也不控制main()就像执行...我只是为现有应用程序编写一个模块,它只使用我的Parent_1作为Parent_2和Base之间的中间部分

你不能,我知道没有办法做到这一点(甚至不用反射),C#中的多态性实际上保证了被覆盖的方法将被调用,除非你告诉它在使用base的重写方法中这样做

Original

如果我理解你所描述的内容..覆盖不会触发基本方法,除非你明确告诉它这样做。

public class Parent_2 : Parent_1
{ 
    public override void hello ()
    { 
       base.hello();
       Print("Hi 2"); 
    }
}

其他资源

Polymorphism (C# Programming Guide)

基类可以定义和实现虚方法,派生类可以覆盖它们,这意味着它们提供自己的定义和实现。在运行时,当客户端代码调用该方法时,CLR会查找该对象的运行时类型,并调用该方法的覆盖。因此,在源代码中,您可以在基类上调用方法,并导致派生类的方法版本被执行。

base (C# Reference)

base关键字用于从派生类中访问基类的成员:

  • 在已被另一个方法覆盖的基类上调用方法。
  • 指定在创建派生类的实例时应调用哪个基类构造函数。

public class Base
{
    public virtual void hello()
    {
    }
}

//
public class Parent_1 : Base
{
    public override void hello()
    {
        Console.WriteLine("Hi 1");
    }
}

public class Parent_2 : Parent_1
{
    public override void hello()
    {
        base.hello();
        Console.WriteLine("Hi 2");
    }
}

public static void Main()
{
    Parent_1 p = new Parent_2();
    p.hello();
}

产量

Hi 1
Hi 2

Full Demo Here


0
投票

那么为什么不能使用base关键字调用基类1

public class Parent_2 : Parent_1
{         
    public override void hello (){ base.hello(); Print("Hi 2"); }        
}
© www.soinside.com 2019 - 2024. All rights reserved.