我在Android的上下文中这样做,但我的问题是理解Java。我对两者都有点新意,所以希望我在这里使用正确的术语。
我从我的超级类(Android Activity扩展)继承/扩展了一些名为SuperActivity的子类。我还定义了另一个名为Network的类类型(这是一个Android服务)。在我的超类中,我定义了一个匿名内部类,它实现了一个名为ServiceConnection的(Android)接口。该接口指定(因此我定义)Android系统将调用的方法。我必须将一个匿名的ServiceConnection实现的内部类的实例传递给一个名为bindService()的方法,以便稍后可以调用匿名内部类中的方法。
正如我所提到的,我正在继承那个定义匿名内部类的超类。匿名内部类中的方法必须在子类实例中设置实例变量;我需要设置的实例变量在这里称为mNetwork。
在超类中:
public class SuperActivity extends Activity {
protected Network mNetwork;
protected ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mNetwork = ((Network.NetworkBinder)service).getService();
}
}
void bindNetwork() {
bindService( new Intent(this, Network.class), mConnection, Context.BIND_AUTO_CREATE);
}
}
所以我创建了我的子类并调用了它的bindNetwork()方法。显然,分配给mConnection的匿名内部类不是我的子类的实例成员,因为在调用匿名内部类中定义的OnServiceConnected()方法之后,子类的名为mNetwork的实例成员为null。
此外,如果我拿着那个持有匿名内部类的mConnection变量并在其上调用getClass()。getName()或者调用它上面的toString(),它会将自己显示为我的超类的内部类,而不是子类。
显然我不了解java继承。我希望有一些子类,每个子类都有自己的mNetwork变量,由匿名内部类中的方法设置。我不想将匿名内部类的定义剪切并过去到每个子类中。必须要有办法。我做错了什么?
答案 0 :(得分:0)
有一种方法:
NetworkProvider
)以下是说明该方法的基本代码:
public interface NetworkProvider {
public void setNetwork(Network network);
public Network getNetwork();
}
public class SuperActivity extends Activity implements NetworkProvider {
private Network mNetwork;
@Override public void setNetwork(Network network){this.mNetwork = network;}
@Override Network void getNetwork(){return mNetwork;}
protected ServiceConnection mConnection = new MyServiceConnection(this);
// more methods
}
public class MyServiceConnection implements ServiceConnection { // or 'extends' if it's a class
private NetworkProvider networkProvider;
public MyService(NetworkProvider networkProvider) {this.networkProvider = networkProvider;}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
networkProvider.setNetwork(((Network.NetworkBinder)service).getService());
}
}