Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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/0/azure/11.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#_Generics - Fatal编程技术网

C# 如何为基类创建可选类型注入?

C# 如何为基类创建可选类型注入?,c#,generics,C#,Generics,在使用常规敏捷编程技术的过程中,我经常进行大量重构。如果我发现了一些共同的东西,他们就是基类的候选人。假设此代码模式: public Subclass : BaseClass{ private dynamic SomeValue = null; public Subclass(){ SomeValue = BaseClass.Method<T>(); } } 公共子类:基类{ 私有动态SomeValue=null; 公共子类(){ SomeValue

在使用常规敏捷编程技术的过程中,我经常进行大量重构。如果我发现了一些共同的东西,他们就是基类的候选人。假设此代码模式:

public Subclass : BaseClass{
   private dynamic SomeValue = null;
   public Subclass(){
       SomeValue = BaseClass.Method<T>();
   }
}
公共子类:基类{
私有动态SomeValue=null;
公共子类(){
SomeValue=BaseClass.Method();
}
}
一切正常,直到我厌倦了不断地将类型注入方法。为什么不将类型注入基类呢?但是等一下,我不想重做已经使用上述模式的20个类。现在我有两种可能的模式可以使用,这是第二种

public Subclass : BaseClass<T>{
   private T SomeValue = null;
   public Subclass(){
       SomeValue = BaseClass.Method();
   }
}
公共子类:基类{
private T SomeValue=null;
公共子类(){
SomeValue=BaseClass.Method();
}
}
第二个模式可能是第一个示例的逻辑派生,在第一个示例中,我们只是将类型移动到类CTOR,而不是在每个方法中使用泛型类型


我想问一下社区,他们对如何在不更改任何当前代码的情况下完成这两种构造,而是添加对泛型类型基类模式的支持的想法。

四人帮再一次说得对,“支持组合而不是继承”。在这种情况下,基类这个术语可能不合适,但是你可以看到我们的基类概念在一开始是错误的,因为我们没有真正地问“这真的是基类吗?”

公共子类{
私有基类bc1=null;
私有基类bc2=null;
私有动态SomeValue=null;
公共子类(){
//我仍然有基本的操作能力,但是现在。。。
bc2=新的基类();
SomeValue=bc2.Method();
}

}

只要不使用继承,就不必“注入”任何东西。继承不应该用于提取公共代码——这是一种代码气味。它只能用于指定“is-a”关系。使用组合、控制反转和实注入-即将您想要的类的接口传递给构造函数,并使用DI容器来自动化构造process@PanagiotisKanavos谢谢,这正是我想要的答案。
public Subclass {
   private BaseClass bc1 = null;
   private BaseClass<SomeType> bc2 = null;
   private dynamic SomeValue = null;
   public Subclass(){
     //I still have base class operation ability, but now...
     bc2 = new BaseClass<SomeType>();
     SomeValue = bc2.Method();
 }