想象一下:我有一堆DTO继承自 Foo class
class Foo { }
class FooA : Foo { }
class FooB : Foo { }
class FooX : Foo { }
我有一个类封装了与Foo
数据类型相关的所有相关逻辑和编排。我提供了一个方法DoSomethingWithData(Foo data)
,它可以完成与参数
方法实现是这样的:
void DoSomething(Foo data)
{
if (data is FooA)
DoSomethingWithFooA((FooA) data);
if (data is FooB)
DoSomethingWithFooB((FooA)data);
if (data is FooX)
DoSomethingWithFooC((FooA)data);
}
这是一个非常简化的例子。这种方法的优点是:
DoSomething
方法
Foo
数据类型DoSomething
我不喜欢的是向下倾斜
替代方法是,不是仅公开DoSomething
方法,而是按每个Foo
数据类型公开方法。优点是我们没有向下转换,但增加了样板/转发代码。
你更喜欢什么?或者你有其他方法吗?
答案 0 :(得分:1)
在这种情况下,我会像这样处理问题(我将在本例中使用Java)。
在您的方法中,对于Foo
的每个子类,您必须提供特定的处理逻辑 - 如您所示,并将Foo
对象强制转换为其子类型。此外,对于您添加的每个新类,您必须更改DoSomething(Foo f)
方法。
您可以将Foo
课程设为interface
:
public interface Foo{
public void doSomething();
}
然后让你的类实现这个接口:
public class FooA iplements Foo {
public void doSomething(){
//Whatever FooA needs to do.
}
}
public class FooB implements Foo {
public void doSomething(){
//Whatever FooB needs to do.
}
}
等等。然后,客户端可以调用doSomething()
方法:
...
Foo fooA = new FooA();
Foo fooB = new FooB();
fooA.doSomething();
fooB.doSomething();
...
这样,您不必在运行时强制转换对象,如果添加更多类,则不必更改现有代码,但必须调用新添加方法的客户端除外对象