Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免引用只包含基类的程序集?_C#_Oop_Inheritance - Fatal编程技术网

C# 如何避免引用只包含基类的程序集?

C# 如何避免引用只包含基类的程序集?,c#,oop,inheritance,C#,Oop,Inheritance,我的班级结构如下: AssemblyA.dll public abstract class MyBase public sealed class MyClass : MyBase AssemblyB.dll(参考AssemblyA.dll) AssemblyC.dll(参考AssemblyB.dll) 编译AssemblyC时,编译器引发错误: 类型“MyBase”是在未引用的程序集中定义的。您必须添加对程序集“AssemblyA,…”的引用 我理解错误的原因,并且在AssemblyC.dl

我的班级结构如下:

AssemblyA.dll

public abstract class MyBase
public sealed class MyClass : MyBase
AssemblyB.dll(参考AssemblyA.dll)

AssemblyC.dll(参考AssemblyB.dll)

编译AssemblyC时,编译器引发错误:

类型“MyBase”是在未引用的程序集中定义的。您必须添加对程序集“AssemblyA,…”的引用

我理解错误的原因,并且在AssemblyC.dll中添加AssemblyA.dll的引用将解决此问题


但我不想再加上这一点。我应该实施什么替代设计实践来避免添加该引用

更多信息:

基类
MyBase
在AssemblyA.dll中用于以下一般实现:

class SomeClassInAssemblyA<T> : ISomeInterface where T : MyBase
public sealed class MyClass : MyBase
{
    public string Xyz { get; set; }
}
在AssemblyB.dll和AssemblyC.dll中使用具体类
MyClass

目标:

  • 引用只能是从A到B到C的单向引用
  • 参考文献应顺序排列,C仅参考B,B仅参考A
AssemblyA.dll正在多个项目中使用。 这就是为什么不能使用
InternalsVisibleToAttribute
。 因此,如果我在AssemblyA中设置成员
internal
,并实现
InternalsVisibleToAttribute
属性,那么这些成员只能对AssemblyB可见;这是行不通的。 我仍然可以修改AssemblyA,但更改不应明确针对特定项目


其他两个部件(B和C)仅由一个项目使用。因此,我可以以任何方式更改它们。

另一种设计实践是使用组合而不是继承:

public sealed class MyClass
{
    private MyBase myBase = ...;
}
如果您的设计确实使AssemblyC能够在不知道
MyBase
的情况下对
MyClass
执行任何合理的操作,那么必须能够在不知道如何初始化
MyBase
的情况下实例化
MyClass
。因此,
MyClass
本身或在DI的帮助下应该包含这些知识


在您的问题中,您似乎假设
MyClass
的客户机不以任何方式依赖于
MyBase
,因此它必须是私有的,并且不会泄漏出
MyClass

“我应该实现什么替代设计实践来避免添加引用?”不要在程序集中使用任何类型。如果以任何方式使用该类型(而不是通过引用编译时常量),则必须引用程序集。引用B中的类型和a中的基类型意味着您需要了解程序集a,否则编译器无法知道它提供了哪些成员。您没有解释的是为什么您不想让程序集C了解程序集A。我唯一的建议是让常见的事情变得普通。分离您的关注点,如果您处于这样的困境中,则是重构的时候了。我的意思是,您的业务逻辑和体系结构没有设计模式。如果你想把东西分成不同的项目,确保它们有一个合适的层次结构。如果你使用一个程序集,你必须引用它,否则编译器无法知道你想要它做什么。您使用的是派生类型,所以您使用的是程序集…基本上,我应该实现什么替代设计实践来避免添加该引用?没有。这里的问题是你试图做一些毫无意义的事情。您必须引用实例化所使用的类所需的所有程序集(句号)。无法提供更多建议,因为您尝试实现的内容不清楚(并且对于此格式来说可能太广泛)。可能重复
public sealed class MyClass
{
    private MyBase myBase = ...;
}