【问题标题】:When to use Foo.Process(Bar) over Bar.Process() in OOP?何时在 OOP 中使用 Foo.Process(Bar) 而不是 Bar.Process()?
【发布时间】:2014-07-03 08:18:22
【问题描述】:

我不知道这些技术叫什么,如有必要,请帮我改写问题。

我在创建课程时总是面临这个困境。 OOP 或某些编程原则中是否存在鼓励Foo.Process(Bar)Bar.Process() 的规则?

Foo.Process(Bar)Bar.Process()Bar 做同样的事情,唯一的区别是声明方法的位置。第一个是Foo 的属性,而后者是Bar 的属性。

【问题讨论】:

  • 两者都是有效的操作。仅凭这个微小的片段,就不可能以一种或另一种方式做出任何明确的陈述。有时你想要 A,有时你想要 B。
  • @deceze “有时”是什么时候?

标签: oop language-agnostic


【解决方案1】:

这是一个简单的例子。

Car c = new Car();
c.start(); //start the car

PetrolStationMan p = new PetrolStationMan();
p.reFill(c); //refill fuel tank

我希望你这样理解更好。 两者都像@deceze 所说的那样有效,这只是一个合乎逻辑的问题

【讨论】:

    【解决方案2】:

    在 OOP 中,状态(数据)和行为(函数/方法)组合在一起,形成对象。

    有些方法告诉你对象的状态(getter 方法)。由于这些方法与对象紧密耦合,因此它们被声明为对象类的一部分。在状态存储在其他无法访问的 (private) 字段中的常见情况下,没有其他选择。

    有些方法会改变对象的状态。如果它们与对象紧密耦合,或者它们改变了private 字段,则它们必须声明为类的一部分(作为 mutator 方法),就像 getter 一样。

    第三种重要的情况是当你有多态性时。也就是说,当一个对象的类具有多个具有不同行为的具体类型时。在这种情况下,哪种行为取决于类型(类),因此 必须 声明为类的一部分。

    剩下的样式Foo.Process(Bar),适用于操作与对象本身没有紧密耦合没有多态性的情况。

     public abstract class Person
     {
        private String name;
    
        // This getter method access the private name field
        // so it must be declared as part of the class
        public final String getName() {
           return name;
        }
    
        // This mutator method access the private name field
        // so it must be declared as part of the class
        public final void setName(String name) {
           this.name = name;
        }
    
        // This method is polymorphic; Minion.getBoss() and Boss.getBoss()
        // have different behaviour and so must be declared as part of the class.
        public abstract Boss getBoss();
    
     }
    
     public class Minion extends Person
     {
        private Boss boss;
    
        public Boss getBoss()
        {
           return boss;
        }
     }
    
    
     public class Boss extends Person
     {
        public Boss getBoss()
        {
           // *I* am the boss, nobody is *my* boss.
           return null;
        }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-03
      • 2012-01-13
      • 1970-01-01
      • 2021-01-07
      • 2023-03-17
      • 2016-01-17
      • 2013-04-12
      相关资源
      最近更新 更多