2012-04-02 86 views
2

如果我想从类Foo转换到另一个类Bar,转换的代码是否应属于FooBar类?转换代码属于哪个类?

Foo f 

Bar b = f.ToBar() 

或者:

Foo f 

Bar b = Bar.FromFoo(f) 

后者可以被改写为一个构造函数,而不是一个静态的方法,但这不是这个问题的地步。

当然,在很多情况下,无法修改其中一个类将为您做出决定。例如,如果我有一个自定义类Foo并希望将其转换为整数。

+0

从酒吧更有意义,因为我们正在创建一个Bar类型的对象,所以在其中创建Bar的所有方法都是自然的。还有一个静态工厂方法,比使用构造函数更有意义。 – 2012-04-02 15:56:22

+0

两个可能的答案,并给出。好的开始。 – Matt 2012-04-02 16:00:09

+0

为什么要创建转换方法而不是构造函数?我的看法是新的Bar(f)更合乎逻辑。 – Betlista 2012-04-02 16:11:28

回答

2

你可以这样看待它:关注点是转换吗? Foo应该知道还是关心其他一些叫Bar的班级,是否正在以某种方式使用它?当然不是。因为,如果有许多其他类以各种方式使用Foo,那么Foo应该继续并照顾它们呢?因此,首要的一点是,这个功能必须在酒吧一边实施。然后,出现次要问题:如何实施它。在这里,像其他人指出的那样,将它作为构造函数来实现,更符合逻辑,并且与oop原则保持一致。

1

该操作应该通常位于它所影响的对象上,因此在这种情况下它应该是f.ToBar()。