是否有一个等价的super用于将方法调用重定向到包装类中的内部字段

StackOverflow https://stackoverflow.com/questions/1603291

  •  05-07-2019
  •  | 
  •  

让我们说我想创建一个类 MyString ,它是 java.lang.String 的包装器。我添加了一个名为 reverse 的新方法。

public class MyString {
    private String text=null;

    public MyString(String foo){
        text=foo;
    }

    public String reverse(){
        // implementation omitted
        return reversedString;  
    }
}

现在 String 是最终的。因此我无法延伸它。让 MyString 支持 String 支持的所有方法的一种方法是提供包装器方法实现,例如方法 toCharArray()

public char[] toCharArray(){
    // redirect to String member field 'text'
    return text.toCharArray();
}

有没有办法可以将方法调用重定向到成员字段而无需实际编写包装器实现?类似于超级的东西?

有帮助吗?

解决方案

不,这不能直接完成。

您可以定义一个包含所有java.lang.String方法(以及您的方法)的接口,并使用动态代理重定向到字符串实现来实现它(具有动态代理)。

对于类型转换 新的MyString(字符串).reverse(),您可能更好用,但遗憾的是Java没有 C#的扩展方法 Scala的隐式类型转换

当然有很多反向实现,例如来自 apache commons library 。它以程序风格实现:

String reversed = StringUtils.reverse(string);

(我认为你的反向方法应该返回MyString而不是String,所以你可以写: s.reverse()。reverse())。

其他提示

不确定我是否完全理解这个问题,但最终,如果您希望 MyString 拥有与 String 相同的所有方法,那么在某种程度上您的班级必须也定义了所有相同的方法。你无法真正解决这个问题。

你可以想出一些简洁的方法,这样你就不必输入返回text.blah(),这比你更优雅;但是我没有看到任何方法可以避免在 MyString 中使用方法定义。

您无法执行此操作,因为您必须编写方法以公开它们以供使用。但是,例如,您可以使用Netbeans的“创建代表...”。功能,只需点击鼠标即可获得所有委托方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top