你能用C#做继承动态吗?

时间:2009-08-16 23:35:04

标签: c# inheritance

我会继承特定对象的动态,并通过app.config文件之类的某种类型的额外设置进行设置。

以下是一个例子:

//PROGRAM A
public class MySuperClass : OldIneritanceObjectVersion
{
       ........Stuff Goes Here
}


//PROGRAM B
public class MySuperClass : OldIneritanceObjectVersion
{
       ........Stuff Goes Here
}

//PROGRAM B .....a Few Years Later.....
public class MySuperClass : NewIneritanceObjectVersion
{
       ........Stuff Goes Here
}

你可以猜到,我希望我的旧东西继续使用OldIneritanceObjectVersion,同时我想要创建新东西以及更新旧东西以使用更新的NewIneritanceObjectVersion。有没有办法动态地做到这一点?

6 个答案:

答案 0 :(得分:5)

没有。 C#是静态类型的。必须在编译时知道每个类的类型层次结构。

答案 1 :(得分:2)

您可以通过T4执行此操作。您可以为您的班级设置模板,并轻松更改此行为。

但这变成了编译时构造,而不是运行时构造。在运行时没有办法(轻松)这样做,没有办法在每次运行时动态生成类型,并且在内存汇编中有某种类型。


另一个想法 -

通过使用Inversion of Control和Dependency Injection,您可以达到相同的效果或朝着这个目标努力。只需使您的类依赖于基类或接口。这样可以在以后,运行时,通过配置或许多其他技术更改实现。

答案 2 :(得分:1)

您可以在单独的DLL中导出“基类”并在项目中引用它。然后,当您拥有此DLL的新版本时,只需替换旧版本。

但是,通过这样做,您必须为基类保留相同的名称,并且它将在任何地方替换为新版本。我想这应该不是问题。

答案 3 :(得分:0)

你可以尝试这样的事情......不要改变OldInheritanceObjectVersion子类所在位置的inhertiance结构。相反,在一个地方改变OldInhertianceObjectVersion的inhertance结构!

//NewInheritanceObjectVersion
public class NewInheritanceObjectVersion
{  /*
      ...Move original stuff from OldInheritanceObjectVersion to this class here
      ...with any new stuff/changes here.  Should probably maintain backwards
      ...compatibility with OldInheritanceObjectVersion if we can
      ...(or OldInhertianceObjectVersion can be an adapter that maintains backwards
      ... compatibility and adapts/delegates to this class)
   */
}

//OldInheritanceObjectVersion
public class OldInheritanceObjectVersion : NewInheritanceObjectVersion
{ /*
      ...Since old and new stuff is implemented in NewInheritanceObjectVersion
      ...this is simply a "pass-through" class so that all classes that inherit
      ...from this class get old and new behavior without changing their inheritance

      ...worst case, this class can expose the old interface/class definition and
      ...delegate/adapt  the methods/properties to the new 
      ...features in NewInheritanceObjectVersion
      ...if NewInheritanceObjectVersion does not implement them directly
  */
}

//PROGRAM B .....a Few Years Later.....
public class MySuperClass : OldInheritanceObjectVersion
{  /*
       ........Without changing this at all, we get all old behavior
       ........and we can update it to take advantage of new features as well 
   */
}

答案 4 :(得分:0)

您实质上是在改变继承链,以依赖于新的具体实现。这很臭,虽然可能通过某种代码Emit - 我从来没有尝试过这种情况,并且倾向于同意John S.--我强烈建议不要这样做。

如果您担心需要将新项目注入到继承链中,我会在“OldInheritenceObjectVersion”中进行一些封装,并通过依赖注入将实际实现注入其中。

我仍然对此感到不舒服,但如果你受到约束并决心通过继承这样做,它可能是阻力最小的路径。

答案 5 :(得分:0)

我知道这个帖子已经很老了,但也许这个答案将来会帮助别人。

是的,这是可能的。今天不仅仅是动态继承,甚至可以实现多重继承(甚至两者同时存在)。你听说过mixins吗?

您的问题的一个解决方案可能是re-motion,一个开源开发框架(它提供了很多很棒的功能,比如在C#中使用mixins):