【问题标题】:Two ways when implement a class实现类的两种方式
【发布时间】:2012-02-17 14:53:28
【问题描述】:

当我想实现一个类时,我不知道两种使用类型之间的真正区别是什么:(我运行并看到它们是相同的结果)

第一个示例:将Renderer 直接实现到类。

第二个例子:创建一个子类并使这个类实现Renderer

我在互联网/电子书上阅读文档时通常遇到的第二个问题。也许解决方案 2 有我不知道的更多好处。

GLSurfaceView glView;

public class TriangleOpenGLTest implements Renderer{

    public void onCreate(Bundle savedInstanceState){

        glView = new GLSurfaceView(this);
        glView.setRenderer(this);   //this line

    }

}

还有:

GLSurfaceView glView;

public class TriangleOpenGLTest implements Renderer{

    public void onCreate(Bundle savedInstanceState){

        glView = new GLSurfaceView(this);
        glView.setRenderer(new Render() );     //And this line

    }

    class Render() implements Renderer{
           //Override function here 

}

请教我。

谢谢:)

【问题讨论】:

  • 注意:在第二个示例中,TriangleOpenGLTest 不必实现 Renderer。该术语是“实现”(通常在接口的情况下)或“覆盖”(通常在基类的情况下),而不是“重载”,这是另一个概念。
  • 哦。对不起。我的意思是Override。谢谢:)

标签: java class implements


【解决方案1】:

这两种方式都不错,但我更喜欢第二种方式。为什么?

我认为这更清楚。这样一来,您就可以清楚地区分 Renderer 接口的具体业务代码和 TriangleOpenGLTest 的其他业务代码。

很容易区分什么是特定于 TriangleOpenGLTest 和什么是特定于渲染的实现。

【讨论】:

    【解决方案2】:

    你应该争取高凝聚力——一个班级应该做一项工作(或多或少)。

    如果一个类实现了一个接口,那么该接口就是该类 API 的一部分(例如,它在其 Javadoc 中显示该类实现了该接口)。所以你应该问自己,例如这个类真的是一个 Renderer 并且打算在任何可以使用 Renderer 的地方使用吗?还是只是一个实现细节?

    如果它只是一个实现细节,那么最好使用另一个类(例如本地内部甚至匿名类)而不是在 API 中泄漏接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      相关资源
      最近更新 更多