2013-03-25 3 views
2

Я хотел бы украсить набор классов, которые происходят из общего класса (TextView). Классы существуют в библиотеке, поэтому я не могу просто изменить базу или вставить в свою иерархию наследования.Можно ли расширить шаблон?

class A { 
} 

class B extends A { 
} 

class C extends A { 
} 

class D extends B { 
    void decoration(){} 
} 

В приведенном выше примере класс D является классом отделки. Функциональность отделки является общей для каждого из моих классов украшения.

Мой вопрос: возможно ли шаблон базового класса в Java? Что-то вроде:

class D<T> extends <T ? extends A> {} 

ответ

2

Итак, ваш вопрос заключается в динамическом добавлении метода к существующим классам? Что-то похожее на категории в Objective-C. Это не так просто сделать на Java, поскольку, как только класс загружается через ClassLoader, вы не можете ничего добавить к нему динамически.

Простейшая вещь, которая приходит мне в голову, заключается в том, чтобы предоставить настраиваемое сопоставление, которое может быть случайным, внешним по отношению к существующим классам. Что-то вроде:

interface Method<T extends A> { 
    public void invoke(T ref); 
} 

class MethodForA implements Method<A> { 
    public void invoke(A ref) { .. } 
} 

class MethodMapper { 
    Map<Class<?>, Method<? extends A>> mapping; 

    MethodMapper() { 
    mapping = new HashMap<Class<?>, Method<? extends A>>(); 
    mapping.put(A.class, new MethodForA()); 
    } 

    void invoke(A object) { 
    Method<? extends A> method = mapping.get(object.getClass()); 
    if (method != null) { 
     method.invoke(object); 
    } 
    } 

Я просто написал этот шаблонный код прямо сейчас, так что все не будет, конечно, правильно, но так, как он будет работать это одна. Я думаю, вам нужно будет выполнить некоторые проверки типов во время выполнения, чтобы избежать слепого каста.

Если вместо этого вы задавались вопросом, если это законно:

class A {  
} 

class B<T> extends A { 
} 

class C<T, U> extends B<T> { 
} 

Да, это так. Вы можете создать дочерний класс, указав параметр типа.

Смежные вопросы