2012-07-12 58 views
0

如果我扩展了Activity并在我的基类中实现了一个事件处理程序(对不起,如果这不是正确的OOP术语),我如何确保我的事件处理程序总是从类延长我的。确保在扩展活动后调用事件侦听器

public class MyActivity extends Activity{ 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
//Stuff that I need to do. 
} 

}//MyActivity class 

public class MainActivity extends MyActivity{ 


protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
} 

}//MainActivity class 

意图是,MyActivity将最终在其他用户将使用的代码库中。 我的班级和扩展班级的活动实例都有单独的有效用途onActivityResult。我显然不能让onActivityResult决赛来阻止人们超越它。

现在,如果用户忘记添加该超级语句,我的代码不会运行。有没有办法强制扩展MyActivity的类的实例在父类中由我定义的方法重叠的方法中运行超类。

+1

这个问题可能会有帮助:http://stackoverflow.com/questions/4217013/how-to-force-derived-class-to-call-super-method -like-android-does – fiddler 2012-07-12 15:41:20

回答

2

如果后来的程序员选择不要致电super那么这是他们的决定,他们将失去继承自班级的好处。据我所知,没有办法保证super将被调用或以任何方式强迫他们打电话给它。

+0

ok,但是说出你的基本活动是否打开了一些资源,并且扩展了这个活动并使你的基本活动对库中的其他活动可用。然后你没有确定的方式来确保你的资源清理代码被执行。 – user1325094 2012-07-16 07:39:44

+1

好点。我想我最好的建议是:也许你的基地活动不应该开放它无法关闭的资源。我不是设计模式专家,但这是我能提供的最好的。您可以尝试将一个受保护的getter留给该资源,以便覆盖类可以访问它,然后留下明确的文档,以便将来的类必须处理它(或至少称为超级类)。 – eternalmatt 2012-07-16 15:38:59

1

据我所知,你不能强制超级方法被调用。

但是,您可以通过这种方式开发MyActivity,以便更容易理解开发人员应该如何使用它。

如果您的父类MyActivity永远不会被实例化,您可以将其设为抽象类。

抽象类可以包含可以调用抽象方法的方法。

抽象方法必须在扩展它的类中实现。

所以你可以编写类似

public abstract class MyActivity extends Activity{ 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    //Stuff that I need to do. 
    onMyActivityResult(requestCode, resultCode, data); 
} 

public abstract void onMyActivityResult(int requestCode, int resultCode, Intent data); 

}//MyActivity class 

public class MainActivity extends MyActivity{ 

@Override 
public void onMyActivityResult(int requestCode, int resultCode, Intent data) { 
} 

}//MainActivity class 
+0

我不知道你得到了我想要做的。我想确保我的代码在基类中获得调用,但是如果MainActivity中的onActivityResult没有super.onActivityResult语句,那么基类中的事件处理程序不会被调用。 – user1325094 2012-07-16 07:47:47

+0

据我所知,其他答案是正确的,没有办法做到这一点。相反,我给出的答案是一种替代解决方案 - 您给他们一个他们必须执行的不同方法。你不能阻止他们重写onActivityResult,但是如果你给他们另一个他们必须实现的方法,允许他们去做onActivityResult,那么至少其他开发人员将能够做到他们需要并且将被迫理解为什么onMyActivityResult存在。 – Scen 2012-07-16 17:47:54

+0

我编辑了我的答案,以澄清我的回应。 – Scen 2012-07-16 17:50:51