C# 未引用项目时重写的方法或属性
考虑具有以下属性的解决方案: 该解决方案包含三个项目A、B和CC# 未引用项目时重写的方法或属性,c#,inheritance,polymorphism,C#,Inheritance,Polymorphism,考虑具有以下属性的解决方案: 该解决方案包含三个项目A、B和C 每个项目都包含一个类ClassA、ClassB和ClassC 项目B引用了项目a ClassB继承自ClassA ClassB覆盖DoStuff()方法来自classa ProjectC引用了Projecta,但没有引用ProjectB 在运行时,ClassC中的方法将对象作为参数接收,该参数是ClassB的实例。接收参数的方法调用对象上的DoStuff()。编译器不允许我调用ClassB中的任何非重写方法,因为我没有对它的引用
- 每个项目都包含一个类ClassA、ClassB和ClassC
- 项目B引用了项目a
- ClassB继承自ClassA
- ClassB覆盖
DoStuff()方法
来自classa
- ProjectC引用了Projecta,但没有引用ProjectB
DoStuff()
。编译器不允许我调用ClassB中的任何非重写方法,因为我没有对它的引用。但是,由于对项目a的引用,编译器将允许调用DoStuff()
。我的问题是,在运行时是调用基类方法还是调用派生类方法。我的测试建议使用派生类,但是否可以安全地假设这将始终有效
注意,这个问题是关于C的,但我想大多数语言的答案都是相似的。
在运行时,ClassC中的一个方法接收一个对象作为参数,它是ClassB的一个实例。
这表明C
不是应用程序的入口点。什么是项目的切入点?那将回答你的问题question@zaitsman让我们考虑这两种情况。如果C是入口点,你将无法在任何地方传递ClassB
的实例,因为C不知道它。例如,如果C
是你的实际可执行文件或web应用程序或其他东西,它不引用B
,那么任何反序列化等都将失败,因为这种类型未知。如果C不是入口点,并且无论什么都引用B和C,那么显然ClassB
可以作为ClassA
传递给ClassC
,并且通过多态性ClassC
可以调用ClassB
实例上的任何ClassA
声明;此外,您可以使用反射来查找和调用ClassB
的任何方法,但您无法编译它们