【问题标题】:Can I fire `override` method in parent and grand-parent classes of base "virtual" method [duplicate]我可以在基本“虚拟”方法的父类和祖父类中触发“覆盖”方法吗?
【发布时间】:2019-07-16 12:14:22
【问题描述】:

即我有 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 在那里“改变”了,所以也许是“财产改变观察者”?

【问题讨论】:

  • base.Hello(); 放入Parent_2hello 方法中。
  • _"我无权访问 Parent_2",你的意思是什么?你不能改变它的代码?
  • 根据您提供给我们的信息,答案是“不,您不能轻易做到这一点”。根据所涉及类型的具体细节,您可以编写自己的 ConvertFromParent_2ToParent_1 函数,您可以使用该函数从 Parent_2 的实例创建一个新的 Parent_1,然后在该新实例上调用该函数.很难知道这对您的特定环境是否有用。
  • 不,你不能,当然,如果你的 hello 方法改变了某些东西,你可以访问,你可以以某种方式检查是否进行了更改,从 Parent_1 调用 hello,但是如果它是你所描述的,你不能不访问(添加一些代码)类Parent_2
  • @SeM 谢谢,我只知道Parent_2 的 hello 在名为xyz 的基本属性发生变化时被调用。

标签: c# inheritance overriding virtual


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    更新

    不幸的是,这对我没有帮助,因为我无法控制 代码的其他部分,无论是 main() 都不像执行......我只是 为现有应用程序编写一个模块,它只使用我的 Parent_1 作为 Parent_2 和 Base 之间的中间体

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

    原创

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

    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

    【讨论】:

    • @T.Todua 我刚刚用base.hello();.. 演示了这一点。更新以显示这一点
    • @T.Todua 更新
    • 我认为另一个向量可能是监视property 的变化?我已经更新了问题。有这种可能吗?
    • @T.Todua 不,所有这些都需要对实例化的类进行编程才能做到这一点.. 可能有 .net 注入技术,但这会复杂得多
    猜你喜欢
    • 2012-12-07
    • 2011-04-17
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多