我已准备好应用并在Google Play商店中运行,现在我正在实施片段。
所以,我已经有了一个用一些方法扩展B的类A,现在我有C扩展FragmentActivity的类,所以现在我需要使用与A类相同的方法但是这里因为我扩展了FragmentActivity我无法使用B类,所以这里有重复的方法,与A类相同,但我需要重用这些方法。
以下示例显示了我的情况:
例如:
当前实施
class A extends B{
one();
two();
}
整合片段后,
例如:
class C extends FragmentActivity{
one();// same methods as in class A
two();// same methods as in class A
}
1)在这种情况下重用这些方法的最佳方法是什么?
2)我在脑海里想法创建一个类并将方法设置为静态并重复使用A和C类中的方法,但是我的方法很好,我可以将方法设置为静态,是吗?一个好方法?
3)我想到的另一种方法“战略模式”。
Eg:
class A extends ApiClass {
private ClassContainingDupMethod strategy;
}
class N extends AnotherApiClass {
private ClassContainingDupMethod strategy;
public methodCallingDupMethod(){
strategy.dupMethod();
}
}
class ClassContainingDupMethod{
public dupMethod(){;}
}
“策略模式”。是一个好方法吗?因为我需要在两个类中创建公共类的对象。
对此有任何建议将不胜感激。
答案 0 :(得分:14)
它比你描述的更简单。你需要做的就是像这样创建D:
public class D{
one();
two();
}
更改A类以使用D类。
public Class A{
public D dLogic;
}
与C班相同。
public Class C extends FragmentActivity{
public D dLogic;
}
在面向对象编程中,这是一个非常基本的东西,它调用composition。
答案 1 :(得分:3)
我怀疑你有一些实用工具方法,只需将它们放在一个类Utils
中,使它们保持静态并从任何你想要的地方调用它们。我的应用程序中有很多实用程序类,如WifiUtils
,LogUtils
,NumberUtils
等等。
答案 2 :(得分:3)
如果要强制使用相同的API,可以尝试向A
和C
类添加接口,同时将A
的实例保留为{{1}的字段}}。 C
将充当C
的包装类。
班级A
:
A
班级class A extends B implements CommonApi {
public void one() {
...
}
public boolean two() {
...
}
}
:
C
答案 3 :(得分:1)
你应该从Babibu所说的开始 - 简单的构图。
当你掌握这个时,还有其他技术。例如,依赖注入看起来像是可以在这里使用的东西。 简单的情况会是这样的。定义接口B而不是类B.在C初始化期间将接口B作为参数传递,将其作为内部变量b并调用b.one()和b.two()。 您必须创建一个在C范围之外实现B的对象A,并在活动C初始化期间将其传入。 优点:C不需要知道如何创建A,您可以稍后将其更改为AA或AAA,只要AA和AAA实现B,就不会再次触摸您的活动。您不必重新测试C.
答案 4 :(得分:1)
如果你在两个片段中都有相同的方法,为什么不使用BaseFragment类(反过来扩展FragmentActivity)并在那里使用所有常用方法。然后你可以在你想要的任何类中扩展这个BaseFragment类。 这样,无论你在BaseFragment中获得什么方法都可以在不重新定义的情况下使用。
答案 5 :(得分:0)
战略模式或'包装'是最佳选择。我认为JuanSánchez的解决方案比Babibu的解决方案更好。与Babibu的代码一样,A类不应该依赖于D.依赖于接口更好。 在您的代码中,如果A类包含某些属性或C类不需要的某些操作,您可以像下面那样重构代码。否则胡安的解决方案就足够了。 我为这种情况绘制了一个UML图像,但我没有足够的声誉发布它:-( 代码是这样的:
interface IAction
{
public void actionA();
}
class A extends B implements IAction
{
private IAction action;
public void actionA() {
action.actionA();
}
}
class C extends FragmentActivity implements IAction
{
private IAction action;
public void actionA() {
action.actionA();
}
}
class D implements IAction
{
public void actionA() {
// put implementation here
}
}
答案 6 :(得分:0)
尽可能地摆脱遗产。你不需要它。类继承几乎总是一个坏主意,特别是如果你期望在实现中有很多未来的变化。唯一真正需要的是当一个设计不佳的框架要求你扩展一些基类时。
在阅读Gamma等人的旧设计模式时,请记住它们是为一个C ++和Pascal是主要OO语言的世界而编写的。 Java仍然处于起步阶段,并引入了这些语言都没有的新颖性(接口)。因此,您应该在思想上用expand替换extends的许多用法,并且最终会得到更好的代码。
基本上,在面向对象设计中保持高一致性和低耦合是一个好主意。类继承很容易导致具有低相干性的高度耦合类(在一个类中有许多不相关的功能)。原因是基类最终具有所有子类不需要的功能,或者仅与某些子类相关的代码路径。此外,随着您的设计的发展,您将结束许多彼此继承且紧密耦合的类。我个人不喜欢处理具有多级继承的代码。它很难阅读,继承的语义也使测试更加痛苦。我从不使用扩展而不是接口,我从九十年代中期就开始使用Java。
由于这个原因,@ Babibu建议使用组合和委托是一个更好的选择。它导致更紧密耦合的更连贯的类。易于维护,易于重构,更易于测试等。