0

标题可能有点混乱,但这是我所面临的

我有一堂课:

    public abstract class BaseFragmentActivity<T> extends FragmentActivity {
    static final int PROGRESS_DIALOG = 0;
    Dialog progessDialog;

    public abstract void displayData(T output);

    @Override
    protected Dialog onCreateDialog(int id) {
        if (id == PROGRESS_DIALOG) {
            ProgressDialog progressDialog = ProgressDialog.show(this, "",
                    "Loading. Please wait...", true);
            progessDialog = progressDialog;
        }

        return progessDialog;
    }

    class PerformOPTask extends AsyncTask<Void, String, T> {
        // connector=new JSONConnector();
        Connector connector;
        String curUrl;
        Class<T> clazz;

        PerformOPTask(String url, Class<T> curClazz) {
            //connector = new UnitTestConnector();
            connector = new JSONConnector();
            curUrl = url;
            clazz = curClazz;
        }

        @Override
        protected T doInBackground(Void... params) {

            return connector.getData(URLUtils.getFormattedUrl(curUrl),clazz);
        }

        @Override
        protected void onPostExecute(T output) {
            displayData(output);

        }
    }




}

然后我有一个子类:

public abstract class BaseListFragmentActivity<T> extends BaseFragmentActivity<T> implements OnItemClickListener, OnClickListener{

    protected ListView mList;


    /** Called when the activity is first created. */
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.table_list);
        CommonUtil.getActionBarWithBackButton(this,getLayoutInflater());
        mList=(ListView)findViewById(R.id.table_list_listView);
        mList.setOnItemClickListener(this);

    }

    public void onBackABButtonPressed(View view) {
        finish();
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

    }

    @Override
    public abstract void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3);


}

现在我正在扩展这个类,如下所示:

public class ListAccountsActivity<T> extends BaseListFragmentActivity<AccountData> {

    protected Acct[] mItems;
    private String[] mIcons;
    protected boolean displayHandledBySubClass=false;


    /** Called when the activity is first created. */
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);


        new PerformOPTask(getString(R.string.get_account),AccountData.class).execute();
        showDialog(PROGRESS_DIALOG);
        //.getData(URLUtils.getFormattedUrl(getString(R.string.get_account)),actData);




    }

    @Override
    public void onItemClick(AdapterView<?> lv, View view, int position, long id) {
        // super.onListItemClick(l, v, position, id);
        // Get the item that was clicked
        Acct account = (Acct) mList.getAdapter().getItem(position);
        Intent intent=new Intent(this,AccountDetailViewActivity.class);
        intent.putExtra("selectedAccount",account);
        startActivity(intent);
    }

    @Override
    public void displayData(AccountData output){


        if(displayHandledBySubClass){
            //handle display in subclass
            handleDisplayData(output);
        }
        else {
            Acct[] accountArray = new Acct[output.getAccount().size()];
            mItems = output.getAccount().toArray(accountArray);
            IWMArrayAdapter<Acct> adapter = new IWMArrayAdapter<Acct>(this, mItems);
            adapter.setIcons(mIcons);
            adapter.setArrowNeeded();
            //mList is superClassVariable
            mList.setAdapter(adapter);
            dismissDialog(PROGRESS_DIALOG);
            adapter.notifyDataSetChanged();
        }
    }

    public void handleDisplayData(T output){

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //Toast.makeText(this, "Tapped search", Toast.LENGTH_SHORT).show();
        super.onCreateOptionsMenu(menu);
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.list_servers_menu, menu);

        // Calling super after populating the menu is necessary here to ensure
        // that the
        // action bar helpers have a chance to handle this event.
        return true;
    }


}

我的问题是我可以以某种方式使handleDisplayData通用,以便我可以将任何类型传递给它。我要做的是尽可能重用BaseListFragmentActivity中的逻辑,并处理特定于ListAccountsActivity或其子类在该类/子类中的唯一任务。

我希望我的问题很清楚,谢谢您的帮助

4

4 回答 4

2

这是你想要的吗?

public abstract class ExtendedGeneric<C> extends GenericBase<DataOutput> {

boolean handleInSub;

@Override
public void displayData(DataOutput t) {
    if(handleInSub){
        handleInSubClass(getValue(t));
    }

    //handle here
    System.out.println(t);

}

protected abstract void handleInSubClass(C c);
protected abstract C getValue(DataOutput t);

}

这当然只是假设数据类型 C 将来自 DataOutput t。这个想法是您还可以使 ExtendenGeneric 参数化,以便您可以使扩展它的类控制提供给 handleInSubClass 的数据类型。

于 2012-05-04T02:07:00.660 回答
2

如果我理解正确,您希望能够使用子类中基类的特定于类型的方法,为此您需要使所有内容都通用:

public abstract class GenericBase<T> { ... }
public abstract class ExtendedGeneric<T> extends GenericBase<T> { ... }
public class ExtendedGenericSub<T> extends ExtendedGeneric<T> { ... }

要点是,如果ExtendedGenericextends GenericBase<DataOutput>,只有 的方法GenericBase<DataOutput>可以从 访问ExtendedGeneric

于 2012-05-04T02:15:29.480 回答
1

你当然可以:

通用父级

public abstract class GenericParent<T> {

    public abstract void displayData(T t);

}

通用儿童

public class GenericChild<T> extends GenericParent<GenericChild> {

    @Override
    public void displayData(GenericChild t) {
        // Do Something Here...
    }

    /**
     * Using protected better than public,
     * to prevent other class access directly to this method.
     * But make sure this the other class is not same package with this GenericChild,
     * because if it same package than the other class can access directly this method.
    **/
    protected void handleSubClass(T t){}
}

子类

public class SubClass extends GenericChild<SubClass> {

    @Override
    public void handleSubClass(SubClass t){
        // Do Something Here...
    }
}
于 2012-05-04T02:14:30.797 回答
1

我们在谈论这种事情吗?

class Vehicle {};

abstract class RoadVehicle extends Vehicle {
  abstract int getNumberOfWheels();
}

class Truck extends RoadVehicle {
  int getNumberOfWheels() {
    return 8;
  }
}

class Car extends RoadVehicle {
  int getNumberOfWheels() {
    return 4;
  }
}

abstract class GenericHandler<T extends Vehicle> {
  public abstract void displayData(T t);
}

abstract class RoadVehicleHandler<T extends RoadVehicle> 
    extends GenericHandler<T> {
  public void displayData(T t) {
    System.out.println(t.getNumberOfWheels() + " wheels");
    specialStuff();
  }

  abstract void specialStuff();
}

class CarHandler extends RoadVehicleHandler<Car> {
  void specialStuff() { /* honk horn */ }
}

class TruckHandler extends RoadVehicleHandler<Truck> {
  void specialStuff() { /* flash lights */ }
}
于 2012-05-04T02:36:10.890 回答