理解Java/C中的抽象和接口#

Jac*_*des 2 c# java language-agnostic

我在努力了解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
}
Run Code Online (Sandbox Code Playgroud)

现在,要做一些事情,我仍然需要做:

Drawable newObject= new line();
Run Code Online (Sandbox Code Playgroud)

我有一个Drawable类型,但我仍然需要创建类的新对象,行.这就是说,纠正我,如果我错了,我仍在创造一个阶级对象,这意味着线; 写上面的代码并没有帮助我保存任何内存,如果上面的事情已经完成内存优化(我知道它更多地与抽象相关而不是内存).

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

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


line newObject= new line();
Run Code Online (Sandbox Code Playgroud)

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

我可以采用相同的方法并对抽象类说同样的事情,因为你仍然必须提供具有重写方法的具体子类.我的问题是,为什么不在不需要抽象类的情况下声明和创建具体对象.

我相信我在这里遗漏了一些东西.什么使界面如此有用?对我来说,只是在实际的类完成实际操作时添加更多代码.任何人都可以关心解释吗?

Pet*_*rey 8

写上面的代码并没有帮助我保存任何内存,如果上面的内容是为了内存优化

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

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

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

canvas.draw(new Line());
canvas.draw(new Square());
canvas.draw(new Circle());
Run Code Online (Sandbox Code Playgroud)

并且您希望开发人员能够添加自己的形状.您不能为它们创建一个draw方法.你想要的是什么

class Canvas {
    public void draw(Drawable drawable) { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)

什么使界面如此有用?

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

我很难想象我之前说过多少次没说过的话.;)