向学生解释界面 [已关闭]

2022-08-31 15:36:14

几年来,我一直担任编程模块 - Java入门的助教,为一年级本科生提供编程模块。

大多数情况下,它进展顺利,我们设法将面向对象编程很好地传达给学生,但是学生很少看到的一件事是接口。

我们给出的几乎任何解释要么显得过于人为,对学习没有用,要么与他们作为初学者的立场相去甚远。我们倾向于得到的反应是“我......看到”,翻译为“我不明白,他们听起来没有用”。

这里有人有办法成功地教学生关于界面的知识吗?我不再是助教了,但它总是唠叨着我。


答案 1

如果你试图向初学者解释它,我会坚持接口可以促进代码重用和代码模块化的想法:

例如,假设我们要绘制一些对象:

public class Painter {
    private List<Paintable> paintableObjects;

    public Painter(){
       paintableObjects = new ArrayList<Paintable>();
    }

    public void paintAllObjects(){
        for(Paintable paintable : paintableObjects){
            paintable.paint();
        }
    }
}

public interface Paintable {
     public void paint();
}

现在,您可以向学生解释,如果没有可绘画界面,Painter对象将需要具有绘制某些类型对象的方法,例如称为和的方法,并且我们需要为我们希望画家能够绘制的每种类型的对象提供一个新的方法。paintFences()paintRocks()Collection

但值得庆幸的是,我们有一些接口,它使绘制对象变得轻而易举,并且如何绘制对象完全取决于实现Paintable接口的类。

编辑

我忘了提到的另一个好处是,如果您需要向代码库添加要绘制的新对象,您需要做的就是创建一个实现Paintable的新类,并且Painter类永远不必更改。从这个意义上说,Painter类从不依赖于它将要绘制的对象,它只需要能够绘制它们。

编辑 2

James Raybould让我想起了我忘了提到的界面的一个关键用途:在你的组件之间有一个接口,比如Paintable对象和Painter对象,可以让你更容易地与其他人一起开发。一个开发人员可以处理 Painter 对象,另一个开发人员可以处理可画像对象,为了一起正常工作,他们所要做的就是事先定义一个他们都将使用的通用接口。我知道,当我在大学水平的项目中与其他人一起处理项目时,当你试图让每个人都在项目的不同部分工作并且最终仍然将所有组件很好地组合在一起时,这真的很有帮助。


答案 2

在向非程序员解释一般的接口和面向对象概念时,我总是使用家庭娱乐系统的类比。

DVD播放器,电视,有线电视盒,遥控器都是封装复杂和精密功能的对象。然而,它们彼此之间以及操作它们的人类之间有接口,这在很大程度上隐藏了这种复杂性的大部分。

电视插孔中的视频是由DVD播放器和有线电视盒以及许多其他类型的设备实现的接口。

我怀疑学生完全使用Java代码来描述自己的家庭娱乐系统是可能的,也许是一种教育练习。