Общий класс, расширяющий класс и реализующий интерфейс
Чтобы уменьшить зависимость от класса, я хочу отправить параметр (используя общий класс) в конструктор, который расширяет некоторый класс и реализует интерфейс, например
public interface SomeInterface{
public void someMethod();
}
public class MyFragment extends Fragment implements SomeInterface{
//implementation
}
//here is classs, that I need to create. T must extend Fragment and implements
//SomeInterface. But, I'm afraid, if I'll use MyFragment directly, it will create a
//dependence of SomeClass from MyFragment.
public class SomeClass /*generic?*/ {
public SomeClass(T parent);
}
Возможно ли это?
Теперь, используя мой класс T, я хочу создавать представления, используя T.getActivity() в качестве контекста.
Ответы
Ответ 1
T должен расширить фрагмент и реализовать SomeInterface
В этом случае вы можете объявить SomeClass
следующим образом:
public class SomeClass<T extends Fragment & SomeInterface>
Для этого требуется объект типа T
для расширения Fragment
и реализации SomeInterface
.
Кроме того, используя мой класс T, я хочу создавать представления, используя T.getActivity() в качестве контекста.
Я не знаком с Android, но если getActivity()
- это метод открытого экземпляра, объявленный в Fragment
, тогда вполне возможно вызвать его в экземпляре T
, так как компилятор будет знать все T
должен наследовать этот метод.
Ответ 2
Вы хотите сделать что-то вроде этого?
class SomeClass {}
interface SomeInterface{
public void someMethod();
}
class AGenericClass<T> extends SomeClass implements SomeInterface {
public void someMethod() {}
}
Это разрешено.
Но какой Android специфичен для вашего вопроса? Я думаю, что я должен что-то упустить, поэтому вы можете предоставить более подробную информацию?
обновление ниже
Я все еще не совсем уверен, что вы хотите сделать, и я также не уверен, что вам нужно немедленно беспокоиться об этой зависимости, но это также законно, используя параметры ограниченного типа:
interface SomeInterface{
public void someMethod();
}
class Fragment {
public void aMethodInFragment() { }
}
public class SomeClass <T extends Fragment & SomeInterface> {
public SomeClass(T parent) {
parent.someMethod();
parent.aMethodInFragment();
}
}
Параметр type <T extends Fragment & SomeInterface>
указывает, что T
должен быть подклассом Fragment
и реализовать SomeInterface
.
Ответ 3
Легко, если я понимаю, что вы исправили, что у вас есть тип T, который расширяет фрагмент и реализует некоторый интерфейс. Поэтому вам нужно написать что-то подобное.
abstract class TemplateFragment extends Fragment implements SomeInterface{}
а затем в ваших классах
class SomeClass<T extends TemplateFragment> {
...
}
Он выполнит трюк.
Ответ 4
Для Kotlin вы можете использовать такой синтаксис:
class MyClass<T> where T: AnotherClass, T: SomeInterface