空实现抽象方法是一个好方法吗?

时间:2016-05-06 11:05:55

标签: java android design-patterns

我正在为我的Android应用程序使用两种不同的Google Analytics服务(Google Analytics和Mixpanel)。

我创建了一个类似的抽象基类:

public abstract class AnalyticsService {

    public abstract void trackAppOpen();
    public abstract void identifyUserOnLogin();

}

然后我创建了从AnalyticsService基类扩展的具体子类。

public class MPAnalytics extends AnalyticsService {
    @Override
    public void trackAppOpen() {
        //Send event to MixPanel
    }
    @Override
    public void identifyUserOnLogin() {
        //Identify user with MixPanel
    }
}

public class GoogleAnalytics extends AnalyticsService {
    @Override
    public void trackAppOpen() {
        //Send event to Google
    }
    @Override
    public void identifyUserOnLogin() {
        //Do nothing
    }
}

现在Google Analytics实际上并不支持用户识别,因此我必须创建registerUserOnLogin()方法的空实现。

我觉得这可能不是正确的方法,因为用户识别不是Google Analytics的行为,因此理想情况下它不应该是基础AnalyticsService类的一部分,而应该在MPAnalytics类中定义{1}}上课。

但是这种方法的问题在于客户端,我希望能够通过使用基类AnalyticsService类来引用所有不同的分析服务,而不用担心具体的实现。

List<AnalyticsService> analyticsServices;
for (AnalyticsService service : analyticsServices) {
    service.trackAppOpen();
    service.identifyUserOnLogin(); // where should this method be?
}

有更好的方法吗?感谢。

1 个答案:

答案 0 :(得分:1)

如果您可以使用界面,请执行此操作 为什么 - &gt;以防你以后继续继承母班。
不要忘记你只能继承一次