2009-11-13 49 views
1

我期待创建一套功能,其中全部某个接口的实现可以扩展使用。我的问题是,是否有办法使用代理或手动扩展接口的每个实现来执行此操作而不使用扩展接口的所有实现的功能?

我最初的想法是看是否有可能使用泛型;使用参数化类型作为我的实施的超级类型...

public class NewFunctionality<T extends OldFunctionality> extends T { 
    //... 
} 

...但这是非法的。我不确切地说知道为什么这是非法的,但它确实是这样的(可能是因为本身可能是一个接口,而不是一个实现)。

有没有其他方法可以实现我想要做的?

编辑的东西一个例子,我可能想要做的是延长java.util.List ...用我的狡猾,非法语法:

public class FilterByType<T extends List> extends T { 

public void retainAll(Class<?> c) { 
    //.. 
} 

public void removeAll(Class<?> c) { 
    //.. 
} 

} 
+1

在C#中,我会使用扩展方法来扩展FilterByType 。我不知道java是否有这个。 – Kristoffer 2009-11-13 07:17:08

+0

当然,如果T是java.util.List之类的接口,那么必须实现而不是扩展,所以非法性实际上非常简单。 这也是你的问题FilterByType-example:T extends List假定T是一个接口,但FilterByType extendsT假定T是一个类。 – ShiDoiSi 2009-11-13 07:25:42

+0

我相信,我的类型参数“扩展”(没有“实现”...)接口或类是非法的。 – 2009-11-13 07:50:55

回答

3

可以使用被称为“装饰”(虽然如果接口较大,则很不幸,这是一个有点冗长,一种编程模式,实现这样的事情在Java中实现,因为你需要写接口中的每个方法的单行实现):

public class FilterByType<T> implements List<T> { 

    private List<T> _list; 

    public FilterByType(List<T> list) { 
     this._list = list; 
    } 

    public void retainAll(Class<?> c) { 
     //.. 
    } 

    public void removeAll(Class<?> c) { 
     //.. 
    } 

    // Implement List<T> interface: 

    public boolean add(T element) { 
     return _list.add(element); 
    } 

    public void add(int index, T element) { 
     _list.add(index, element); 
    } 

    // etc... 

} 

或者,如果该方法不需要访问受保护的成员,那么静态辅助方法都不太clucky替代方案:

public class FilterUtils { 

    public static void retainAll(List<T> list, Class<?> c) { 
     //.. 
    } 

    public static void removeAll(List<T> list, Class<?> c) { 
     //.. 
    } 

} 
+0

欢呼的答案 - 装饰者模式是我在考虑的技术之一,当我提到代理退出实施。虽然没有想过使用助手类 - 也许这是要走的路... – 2009-11-13 07:47:53

1

什么阻止你只需添加新的方法的接口?

如果您不能只将新功能添加到旧界面,则可以考虑制作另一个界面,然后再制作一个只实现这两个界面的实施。只要是明确的,在代码这是我的意思是:

// Old functionality: 
public interface Traveling { 
    void walk(); 
} 
// Old implementation: 
public class Person implements Traveling { 
    void walk() { System.out.println("I'm walking!"); } 
} 
// New functionality: 
public interface FastTraveling { 
    void run(); 
    void fly(); 
} 
// New implementation, option #1: 
public class SuperHero extends Person implements FastTraveling { 
    void run() { System.out.println("Zoooom!"); } 
    void fly() { System.out.println("To the skies!"); } 
} 
// New implementation, option #2: 
public class SuperHero implements Traveling, FastTraveling { 
    void walk() { System.out.println("I'm walking!"); } 
    void run() { System.out.println("Zoooom!"); } 
    void fly() { System.out.println("To the skies!"); } 
} 
+0

感谢您的回答,Esko。我已经添加了一个例子,希望能够比我的最初问题更有效地说明我所得到的结果...... :) – 2009-11-13 07:12:35

1

我认为这是非法的,因为你不能保证T类会是什么。还有技术障碍(父类的名字必须用字节码写,但泛型信息在字节码中丢失)。

可以使用Decorator模式是这样的:

class ListDecorator implements List { 
    private List decoratingList; 
    public ListDecorator(List decoratingList){ 
    this.decoratingList = decoratingList; 
    } 

    public add(){ 
    decoratingList.add(); 
    } 

    ... 
} 

class FilterByArrayList extends ListDecorator { 
    public FilterByAbstractList() { 
    super(new ArrayList()); 
    } 
} 
0

恐怕目前还不清楚你想要得到什么。

基本上,我没有看到在使用任何好处 '公共类NewFunctionality <牛逼延伸OldFunctionality >扩展T'在比较'公共类NewFunctionality扩展OldFunctionality'“公共class FilterByType < T extends List > extends T' vs 'public class FilterByType <T> implements lists <T>'

+0

如果我的过滤器只是实现了List接口,我必须实现这个接口定义的每个方法 - 实际上我会代理现有的功能。我不一定说这不是正确的方法,但我有兴趣知道是否有人有任何其他想法。 – 2009-11-13 07:54:55

+0

好的,那么,为什么不扩展目标List实现?例如。 class FilterByType <T> extends ArrayList <T> – 2009-11-13 09:09:24

+0

当然,我可以这样做 - 但后来我需要为每个实现(ArrayList,Vector,LinkedList等)执行相同的操作。我应该补充一点,这个例子不一定是我想要使用这个功能的 - 这只是一个例子。 – 2009-11-13 09:25:49

1

有一个委托/ mixin框架允许这种形式。您可以定义一个新接口,实现该接口的默认实现,然后请求实现该接口但从您的层次结构中的其他位置创建子类的类。

它被称为mixins for Java,并有一个网络直播就在那里演示它。

+0

谢谢!我会看看。 – 2009-11-13 08:06:49