代码之家  ›  专栏  ›  技术社区  ›  hashable

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

  •  2
  • hashable  · 技术社区  · 15 年前

    假设我想创建一个类 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 是最后的。因此我不能延长它。一种方法 字符串 支持所有方法 支持是通过提供包装方法实现,如方法 toCharArray() :

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

    是否有一种方法可以将方法调用重定向到成员字段而不必实际编写包装器实现的代码?类似super的东西?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Thomas Jung    15 年前

    不,这不能直接完成。

    您可以定义一个包含所有java.lang.string方法(加上您的方法)的接口,并用 动态代理 重定向到字符串实现(具有 dynamic proxies )。

    也许你更喜欢 类型转换 new MyString(string).reverse() 不幸的是Java没有 C#'s extension methods Scala's implicit type conversions .

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

    String reversed = StringUtils.reverse(string);
    

    (我认为您的reverse方法应该返回mystring而不是string,这样您就可以编写: s.reverse().reverse() )

        2
  •  1
  •   matt b    15 年前

    不确定我是否完全理解这个问题,但最终,如果你想要你的 MyString 拥有与 String 在某种程度上,类还必须定义所有相同的方法。你真的不能逃避这个。

    你可能会想出一些巧妙的方法,这样你就不必为每种方法输入 return text.blah() ,比这更优雅的东西;但是我看不出您如何避免在您的 字符串 完全。

        3
  •  1
  •   MicSim    15 年前

    您不能这样做,因为您必须编写方法来公开它们以供使用。但是,例如,您可以使用NetBeans的“创建委托…”功能,并通过单击鼠标获得所有委托方法。