我可以访问一个无法修改的类结构,如下所示:
Graphics
Circle
Line
etc.
再说一次,我不能修改它!这些都具有单独的属性,例如Radius
、FirstPoint
、LastPoint
等,以及一些共同的属性。
我想创建一个接受Graphics
对象的方法,并且根据对象的类型,将运行一个ToJson
方法:
Graphics g = db.GetGraphic(123);
// Console.WriteLine(g.GetType()) prints "Circle"
// Should run some specific implementation for `Circle` type graphics, and
// have an overload for all types including Graphics
ToJson(g);
起初我以为我可以巧妙地重载该ToJson
方法:
ToJson(Graphics g) { ... }
ToJson(Circle g) { ... }
ToJson(Line g) { ... }
但是,这当然适用于ToJson(Graphics)
每次的通用重载。
我确定我可以执行以下操作:
if (g is Circle) ...
if (g is Line) ...
if (g is Graphics) ...
或创建一个字典来降低每种类型的复杂性,但这并不是最好的做事方式
我考虑过的
我已经考虑过是否可以在每个对象周围使用一些通用的包装方法(例如,new JsonGraphics(g).ToJson()
),但我不想自己执行任何手动类型检查。
我已经查看了双重调度和访问者模式,但我不确定它们是否满足我的要求,因为它们看起来我必须修改这些类(或者我可能只是没有完全理解它们),并且(有点明显,但是) 泛型也基本上不在窗口中,因为它们需要我提前知道Graphics
这是什么类型的对象。
那么两个问题:
除了使用某些 Dictionary 或其他类似的东西之外,还有更好的方法if (g is Type)
吗?
如果我可以修改类,模式会怎样?在这种情况下这是不可能的,但是在我可以的情况下,双重调度/访客是最好的方式吗?