我会继承特定对象的动态,并通过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。有没有办法动态地做到这一点?
答案 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):