何时返回此引用是有意义的?

时间:2009-02-24 13:29:07

标签: language-agnostic oop

目前我只能想到在(公共)方法中返回 this的三个充分理由,即:

  1. mmyers)实施流畅的界面时,例如

    public class X
    {
      ...
      public X enableValidation()
      {
        setValidation(true);
        return this;
      }
      ...
    }
    
  2. Jon Skeet身份转换,例如

    public class X
    {
      ...
      public X toX()
      {
        return this;
      }
      ...
    }
    
  3. Dave Ray)在不可变对象上实施 clone()copy() 方法,例如

    @Immutable
    public class X
    {
      ...
      public X copy()
      {
        return this;
      }
      ...
    }
    
  4. 在面向对象语言中是否还有其他有用的方案,您可以从方法返回thisself

6 个答案:

答案 0 :(得分:4)

如果您正在创建链接操作(但这可能不是非常OOP'ish - Demeter法则等。)

示例(不是很有意义):

public class X 
{
   public X Add(int i) 
   { 
      this.Value += i; 
      return this;
   }

   public X Subtract(int i) 
   {
      this.Value -= i;
      return this;
   }

   public int Value 
   {
      get;
      set;
   }
}

new X().Add(4).Subtract(5).Value;

答案 1 :(得分:2)

String.toString():)

更严重的是,有类似的“转换为[x]”场景,可以只返回“这个”...但我想不出很多其他情况。

答案 2 :(得分:2)

对不可变对象的任何clone()或copy()方法的实现。

答案 3 :(得分:0)

C ++一直这样做以允许级联运算符。

例如<<运算符始终返回自身(ostream),以便您可以以这种方式级联调用:


std::cout << "call 1" << "call2" << std::endl;

我认为这种级联效果很受欢迎的唯一语言是C ++。

答案 4 :(得分:0)

关于流畅的界面快速添加:

正如本文“流畅界面的一个简单例子”文章(评论末尾)所述,:

  

使用继承以及流畅的界面时,你会遇到困难,因为:

     
      
  • 使用多态方法打破了您的调用链
  •   
  • 你绝对不希望通过在不需要它们的情况下使用丑陋的铸造和括号,或者在执行铸造的子项中进行大量无用的覆盖来使界面不流畅
  •   

alt text http://withasmiletomeltathousandhearts.files.wordpress.com/2009/02/fluent_interfaces_order_class_hierarchy.jpg?w=300&h=255

在此article about a more robust pattern for complex (and yet fluent) hierarchy of classes中,“this”用于返回基类“Builder”的实例,而具体类的Builder使用强制转换。

答案 5 :(得分:0)

采取以下实施方式。

public interface Monitorable {
   public Statistics getStatistics();
}

public interface MonitorManager {
   public Monitorable getMonitorable();
}

class MonitorableService implements Monitorable, MonitorManager {
   public Monitorable getMonitorable() {
      return this;
   }
}

// Meanwhile somwhere else...
MonitorManager manager = getMonitorManagerFromSomewhere();
Monitorable monitorable = manager.getMonitorable();

我承认这是相当做作的,但总体模式/信息应该清楚。

这里我不需要知道MonitorManager是由Application类实现的。我也不需要知道应用程序实现了Monitorable。

这里使用多态来封装Application的实现细节。哪个不是公共课。这是一种非常常见的模式,可以在各种各样的项目中看到。