c# – .Net继承 – 自动依赖性引用行为问题
我遇到了一个我刚刚注意到的奇怪问题.
如果您有3个项目的解决方案 **注意讨论后编辑** 项目LibA – 拥有ClassA namespace LibA { public class ClassA { public override string ToString() { return "The logic in class A!"; } } } 项目LibB – 拥有ClassB using LibA; namespace LibB { public class ClassB { public ClassA a; public ClassB() { a = new ClassA(); } public object Foo() { return a; } } } LibC项目 – 拥有ClassC using LibB; namespace LibC { public class ClassC { public ClassB b; public ClassC() { b = new ClassB(); } public object Foo() { return b.Foo(); } } } 最后是测试驱动程序 using System; using LibC; namespace Shell { class Program { static void Main(string[] args) { ClassC c = new ClassC(); Console.WriteLine(c.Foo()); } } } 现在如果你编译它,一切都会完美.如果你检查LibC的二进制文件夹的内容,你会看到它自动遍历依赖链,以确定它需要拉入LibA和LibB 但是,如果您将ClassB更改为继承自A类 using LibA; namespace LibB { public class ClassB : ClassA { ClassA a; } } 尝试编译,你会得到错误
**原始问题** 有没有人知道为什么(无论是msbuild还是visual studio)当ClassA成为ClassB的成员时,它足够聪明地引用LibA,但是当ClassA是ClassB的基类时,它不足以引用LibA? 我知道这很挑剔,但我真的很感激一些一贯的行为 **这些观察到的测试的修正问题** 我听到一些人定义为“直接”或“间接”的引用.但是,直接显然不仅仅是可见性范围,它似乎是一种类型的继承和实际使用. 没有继承,测试驱动程序足够聪明,可以解析并自动引用LibA,LibB和LibC. 在ClassB中有一个公共成员ClassA可见,但仅此一项不会产生编译/链接错误. 调试器肯定会从测试驱动程序中解析ClassA,因此它显然加载了正确的程序集. 所有这一切都在考虑之中.我现在得到了整个“直接”和“间接”的东西. 那个仍然没有点击我的东西为什么链接器/编译器/ IDE至少不会尝试在“直接”场景中自动引用引用库的依赖关系?显然足够聪明,可以知道依赖关系,并在“间接”场景中引用它们. 解决方法
这是一致的行为.第一个是简单的引用,第二个是继承.
如果编译了程序集并且某个类继承自另一个程序集中的类,则需要该引用来构造它. LibB仅包含在ClassB的类定义中添加的信息,它不会从LibA复制所有内容(如果更新LibA并且在执行此操作时更改了ClassA,则会产生不一致的代码,LibB仍将包含旧信息). 因此,要在LibC中使用继承的类定义,它需要来自LibA(对于ClassA)和LibB(ClassB)的信息来构造它,因此需要直接引用LibA. 在该示例中,对不同程序集的类的所有引用都是私有的,因此只需要下一级(ClassC不需要知道ClassA,因为没有直接使用该类).如果ClassB中ClassA的使用是公共字段或者有效,则ClassC将直接引用ClassA,并且还需要直接引用该类定义(从LibC引用LibA). 在另一种形式中,继承示例中也是如此. ClassC直接引用ClassA(由于来自ClassA的ClassB inherting),因此需要引用声明程序集(即LibA)来构造完整的类定义. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- xml之 CDATA介绍
- reactjs – 如何测试依赖于上下文和钩子的反应组件?
- Flex调用GP服务实现按划选范围切割地图(一)
- c – 为什么std :: priority_queue使用max heap而不是min h
- swift: unrecognized selector sent to instance
- MT 112 Status of a Request for Stop Payment of a Cheque
- flash and vc++制作精美界面程序
- ruby-on-rails – 导轨中的外键4
- 数组 – swift 3数组结构 – >强制转换为NSObject – >强
- 2.2 单一职责原则