将.NET对象的类更改为子类

3
我有一个面向对象的设计问题。
我正在使用工厂模式来创建适合传递给工厂的参数的类的对象。然而,有些属性只能在创建对象后才能获取,我想要使用它们进一步子类化或“专门化”对象类型。
我需要使用子类多态性来为具有附加输入参数的对象使用自定义逻辑。
我认为这是一种设计模式“运行时重新确定对象类”。我该如何实现它?哦,也许这是不好的做法?

你有任何可以发布的代码示例吗? - Ian R. O'Brien
我正在编写一个测量应用程序。为了检测测量类型,用户需要提供一些输入参数。为了检测最终的测量类型(类),用户需要通过4个屏幕(gui)。在每个下一步中,我都需要调用虚拟Meas.Init,这对于不同类型是不同的。因此,我需要在每个步骤中重新确定测量类型。 - Andrew Kalashnikov
2个回答

2

您无法在运行时更改对象类型。如果您有基类的实例,则它将保持基类类型。但是,您可以在运行时创建新对象。使用组合而不是继承。

也就是说,不要从基类继承,而是创建另一个对象层次结构 - 提取代码到新类(不是从基类继承)中,在基对象创建后更改。这可能是一些策略。然后在运行时为基本对象提供不同的策略实现(即“专门化”基类实例)。


我无法引入一个封装算法(策略)的新类。我应该只有一个层次结构。但是你的回答很有用。谢谢。 - Andrew Kalashnikov
1
@AndrewKalashnikov,你的层次结构不会改变。你只需为创建的对象提供新的依赖项。例如:IFoo foo = factory.GetFoo()(这是你现在拥有的)。但是,你不需要创建新类型FooWithRedAttribute,而是提取Color并将其提供给你的foo实例:foo.Color = Red。希望这可以帮到你 :) - Sergey Berezovskiy

0

无法更改实例化对象的类型,但我看到有两种可能的解决方法:
1.从您的初始工厂实例化另一个工厂,最终将创建所需类型的对象。
2.使用 Ruby 的“method-missing”概念与 ExpandoObject。我不确定它是否适用于您的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接