2

这个问题是在我努力理解 Java/C# 中的接口时提出的。正如我的程序员朋友告诉我的,接口是最容易理解但很难有效使用的概念之一。任何想要投反对票的人,请考虑在投反对票之前指导我正确的方向(我不介意,只要我获得了我所寻求的知识)。

我了解界面的工作原理,但它的使用对我来说似乎有点模糊。

考虑一下:

public interface Drawable {
public void draw(Graphics g);
}


public class Line implements Drawable {
public void draw(Graphics g) {
. . . // do something---presumably, draw a line
}
. . . // other methods and variables
}

现在,要对此做点什么,我仍然需要做:

Drawable newObject= new line();

我有一个 Drawable 类型,但我仍然需要创建类的新对象 line。话虽如此,如果我错了,请纠正我,我仍在创建一个类对象,这意味着;写上面的代码并不能帮助我节省任何内存,如果上面的事情是为了内存优化而做的(我知道它更多地与抽象相关而不是内存)。

我的问题是:如果类行具有在它实现的接口上指定的方法,为什么我不能只执行以下操作?

public class Line {
    public void draw(Graphics g) {
    . . . // do something---presumably, draw a line
    }
    . . . // other methods and variables
    }


line newObject= new line();

毕竟,接口除了创建一个基本类型之外什么也没做。我的新手理解是:第二个根本不需要接口并减少代码。

我可以对抽象类采取相同的方法并说同样的话,因为您仍然必须为具体的子类提供覆盖的方法。我的问题是,为什么不声明和创建不需要抽象类的具体对象。

我确定我在这里遗漏了一些东西。是什么让界面如此有用?对我来说,当实际的事情由实际的类完成时,它只是添加更多的代码。有人可以解释一下吗?

4

7 回答 7

8

如果为内存优化做了上述事情,编写上面的代码并不能帮助我节省任何内存

良好的编程习惯很少与性能有关。在这种情况下,你是对的。

毕竟,接口除了创建一个基本类型之外什么也没做。我的新手理解是:第二个根本不需要接口并减少代码。

你的榜样是对的。现在考虑你有其他 Drawable 不仅仅是一条线,例如

canvas.draw(new Line());
canvas.draw(new Square());
canvas.draw(new Circle());

并且您希望开发人员能够添加自己的形状。你不能为它们都创建一个绘制方法。你想要的是像

class Canvas {
    public void draw(Drawable drawable) { /* ... */ }
}

是什么让界面如此有用?

https://www.google.com/search?q=What+makes+interface+so+useful获得 1.38 亿次点击。

很难想象我能说什么以前没有说过很多次。;)

于 2013-09-26T12:48:08.420 回答
3

接口是一种方法,通过该方法,几个(可能完全不同的)类可以表明它们具有共同点,并且可以传递给某些方法,这些方法不关心它们在其他领域的根本差异,只关心它们在其他方面的相似之处。

我自己的代码中的一个例子;

public interface ToolAffected {

    public void toolUsedOnMe(Tool tool, PickingResult pickingResult,Mob toolUser);
    public void toolUsedOnMe(BlockTool tool, PickingResult pickingResult,Mob toolUser);
    //use polymorphism for more detailed blocks
}

因此,如果我有一个特定的工具,那么我可以在任何实现 ToolAffected 的东西上使用它。这可能是环境的一部分,玩家,任何东西。在这种情况下,我从他们的图形中挑选了 ToolAffecteds(远远超出了这个问题的范围),但重要的是,将 ToolAffected 连接到图形的所有代码,在它上面使用该工具并不关心什么实际上是,只是它有这两种方法。

我这样用

        ToolAffected pickingResult=picker.picked(cam.getLocation(),cam.getDirection());
        target.toolUsedOnMe((BlockTool)inventory.getSelectedTool(), pickingResult, this);
于 2013-09-26T12:47:06.673 回答
1

在java中

将接口视为摆脱多重继承所涉及的复杂性的一种方式(因为它在 Java 中不受支持)。此外,它还可以用作多态引用。

于 2013-09-26T12:51:09.287 回答
0

我认为,您至少应该通过 SOLID 原则和 esp程序来实现接口而不是实现

于 2013-09-26T12:51:27.070 回答
0

假设您有一些几何形状,例如正方形,圆形。他们都可以在纸上进行表示。假设您有一个知道如何绘制形状的班级(艺术家?)。你会怎么做?为每个形状编写方法?事实上,你最终会得到更多的代码。

相反,您可以public void draw(Drawable obj) { obj.draw(); }在艺术家类中使用类似的方法。您现在需要的只是为您的 Square、Circle 和其他 Shape 类实现 Drawable。

您可能会说:我会将绘图添加到 Shape 类,Artist 将收到一个 Shape。这是错误的,也许我的例子没有很好地选择,但让我们假设一些你无法绘制的形状。所以功能必须放在 Drawable 接口中。

于 2013-09-26T12:52:24.617 回答
0
  1. 您可以实现多个接口。但是你只能扩展一个类。
  2. 它更抽象。您定义可以对对象执行的操作,例如 Comparable Movable Closable 等。类不必在同一层次结构中
于 2013-09-26T12:52:49.227 回答
0

抽象类和接口的区别

您可以访问此链接,您一定会了解两者之间的区别。这是了解 OOP 概念及其实现的最佳站点。还有一些例子对你将来有帮助,

于 2013-09-26T12:48:10.860 回答