我有两个不同类型的对象:
if (phone) {
listView = (ObservableListView) getActivity().findViewById(R.id.castdetailscredits);
if (listView != null) {
listView.setOnItemClickListener(this);
listView.setScrollViewCallbacks(activity.getCastDetailsFragment());
listView.setTouchInterceptionViewGroup((ViewGroup) activity.getCastDetailsFragment().getView().findViewById(R.id.containerLayout));
Bundle save = activity.getCastDetailsCreditsBundle();
if (save != null) {
moviesList = save.getParcelableArrayList("moviesList");
movieAdapter = new MovieAdapter(getActivity(), R.layout.row, this.moviesList);
listView.setAdapter(movieAdapter);
}
}
} else {
gridView = (ObservableGridView) getActivity().findViewById(R.id.castdetailscredits);
if (gridView != null) {
gridView.setOnItemClickListener(this);
gridView.setScrollViewCallbacks(activity.getCastDetailsFragment());
gridView.setTouchInterceptionViewGroup((ViewGroup) activity.getCastDetailsFragment().getView().findViewById(R.id.containerLayout));
Bundle save = activity.getCastDetailsCreditsBundle();
if (save != null) {
moviesList = save.getParcelableArrayList("moviesList");
movieAdapter = new MovieAdapter(getActivity(), R.layout.row, this.moviesList);
gridView.setAdapter(movieAdapter);
}
}
}
是否可以根据某些条件创建一个将指定其中一个对象的变量。然后打电话给他们的方法?它是通用类型的东西吗?对不起,如果有人问过,我不知道怎么叫这种技术。
编辑:我正在努力避免代码重复:
matCheck <- ( mat1 | !mat2 )
答案 0 :(得分:1)
实际上有几种方法可以做到这一点:
<强>反射强>:
//I don't know this object so I'm using a default constructor
ObservableListView listView = new ObservableListView();
ObservableGridView gridView = new ObservableGridView();
Object obj;
if(condition)
{
obj = listView;
}
else
{
obj = gridView;
}
Method method = obj.getClass().getMethod("methodname", param1.getClass(), param2.getClass());
try
{
method.invoke(obj, param1, param2);
}catch(Exception e){}
<强>继承强>:
//assuming that there is some parent class of both classes that contains methods that you would like to use
ObservableListView listView = new ObservableListView();
ObservableGridView gridView = new ObservableGridView();
ObservableView view;
if(condition)
{
view = listView;
}
else
{
view = gridView;
}
view.someMethod();
<强>接口强>:
//this assumes that both ObservableListView and ObservableGridView implement some interface 'IObservableView'
ObservableListView listView = new ObservableListView();
ObservableGridView gridView = new ObservableGridView();
IObservableView view;
if(condition)
{
view = listView;
}
else
{
view = gridView;
}
view.someMethod();
<强> INSTANCEOF 强>:
//very flexible version. I think that this is the route I would choose
ObservableListView listView = new ObservableListView();
ObservableGridView gridView = new ObservableGridView();
Object obj;
if(condition)
{
obj = listView;
}
else
{
obj = gridView;
}
if(obj instanceof ObservableListView)
{
((ObservableListView)obj).someMethodOnlyInThisClass();
}
else if(obj instanceof ObservableGridView)
{
((ObservableGridView)obj).someOtherMethodOnlyInThisClass();
}
我会避免使用反射。
继承仅在您要使用的方法在两个类中并从超类继承时才有效。
如果超类没有相同的方法但两个子类都实现了接口,那么接口就可以工作。
instanceof
可能是最灵活的解决方案,不会使用反射,虽然有些人会忽略它的使用。
因为您用更明确的目标更新了答案。这就是我要做的事。
AdapterView view = (AdapterView) getActivity().findViewById(R.id.castdetailscredits);
if(view != null)
{
view.setOnItemClickListener(this);
((Scrollable)view).setScrollViewCallbacks(activity.getCastDetailsFragment());
((Scrollable)view).setTouchInterceptionViewGroup((ViewGroup) activity.getCastDetailsFragment().getView().findViewById(R.id.containerLayout));
Bundle save = activity.getCastDetailsCreditsBundle();
if (save != null) {
moviesList = save.getParcelableArrayList("moviesList");
movieAdapter = new MovieAdapter(getActivity(), R.layout.row, this.moviesList);
view.setAdapter(movieAdapter);
}
}
我们在上面提到了几种技术。特别是继承(AdapterView
)和接口(Scrollable
)。