1

假设我们有一个分析应用程序 (AppX),它允许导入和导出分析文件。我们希望在其中构建一些功能以允许在企业协作平台中共享这些文件,但是我们使用 2 个不同的平台,例如 Jive 和 Workplace。

虽然这有点主观,但我想看看这个模型是否符合 OO 概念的约定?

1 - 我们interface CollaborationService定义了必须实现的方法才能实现全部功能。

2 - 我们有 abstract class DefaultCollaborationService implements CollaborationService一些操作的默认实现。

3 - 我们有 aclass WorkplaceCollaborationService extends DefaultCollaborationService和 a class JiveCollaborationService extends DefaultCollaborationService,每个都有自己的方法,它们覆盖 Default 抽象类中的方法。

或者..

这是否更好:

2 - abstract class DefaultCollaborationService- 注意,没有链接到接口,所以我们不必实现所有东西

3 -class WorkplaceCollaborationService implements CollaborationService extends DefaultCollaborationServiceclass JiveCollaborationService implements CollaborationService extends DefaultCollaborationService

或者..

这一切都不对吗,您可以提出更好的方法吗?

4

3 回答 3

1

这是在“固执己见”的边缘,所以让我们关注事实:

选项 1(使用抽象基上的接口)类应该是首选:这个类的全部目的是为您的接口的某些方法提供实现。您会看到,当接口更改时,您可能希望编译器告诉您必须查看基类中的实现。

请记住:您不必实现所有方法 - 您仍然可以将那些abstract无法实现的方法留在这个级别。

除此之外,您的方法似乎是合理的。

于 2017-08-23T11:09:37.543 回答
1

让我们看一下整个模式,以了解所需的实现和提供的服务。

class Use1 extends Base
    @Override protected onA(X x) { }
    @Override protected onB(X x) { }

class Use2 extends Base
    @Override protected onA(X x) { }
    @Override protected onB(X x) { }

abstract class Base implements Api
    abstract protected onA(X x); // Requirement
    abstract protected onB(X x);
    public final a () { onA(x); } // Service
    public final b () { onB(x); }

interface Api
    public final a ();
    public final b ();

第一种方法最适合这一点。但是今天什么是抽象类和接口随着默认方法的不同而不同。

于 2017-08-23T11:29:11.543 回答
0

如果您正在寻找面向对象的解决方案,那通常会关注您的业务领域所涉及的“事物”。我对这两种提议的解决方案的主要问题是,它几乎没有反映您在第一段中描述的问题的任何内容。

所以,让我们看看你的问题域由什么组成:分析文件JiveWorkplace,你提到“平台”是后两者的抽象。这些是第一段中提到的“事物”。

好的,那么我们需要处理的“职责”(业务功能)是什么?您提到“共享”,所以让我们开始吧。

让我们把所有这些放在一起:

public interface AnalyticFile {
    void shareTo(Platform platform);
}

public interface Platform {
    void share(byte[] data); // Whatever data is necessary
}

public final class Jive implements Platform {
    ...
}

public final class Workplace implements Platform {
    ...
}

对于您提出的实际问题:

  • 如果您想定义通用功能,请始终使用接口
  • 尽量避免“默认”或“基本”实现,即使是接口。这不是继承的目的。也就是说,它不是为了共享代码,而是为了表达类之间的关系。
于 2017-08-24T08:07:02.630 回答