这个问题在这里已有答案:
即我有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_2
的hello
被执行时,我的Parent_1
的hello
也被解雇了。
我认为应该存在某种方式,所以当Parent_2
被执行时,不知何故我在Parent_1
得到通知(事件处理程序或其他),这不可能吗?我知道xyz
在那里“改变了”,所以也许是一个“财产变化观察者”?
不幸的是,在我的情况下没有帮助,因为我既不控制代码的其他部分,也不控制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关键字用于从派生类中访问基类的成员:
- 在已被另一个方法覆盖的基类上调用方法。
- 指定在创建派生类的实例时应调用哪个基类构造函数。
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
那么为什么不能使用base
关键字调用基类1
public class Parent_2 : Parent_1
{
public override void hello (){ base.hello(); Print("Hi 2"); }
}