C# 未引用项目时重写的方法或属性

C# 未引用项目时重写的方法或属性,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中的任何非重写方法,因为我没有对它的引用

考虑具有以下属性的解决方案:

该解决方案包含三个项目ABC

  • 每个项目都包含一个类ClassAClassBClassC

  • 项目B引用了项目a

  • ClassB继承自ClassA

  • ClassB覆盖
    DoStuff()方法
    来自classa

  • ProjectC引用了Projecta,但没有引用ProjectB

在运行时,ClassC中的方法将对象作为参数接收,该参数是ClassB的实例。接收参数的方法调用对象上的
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
的任何方法,但您无法编译它们