抽象类和接口的区别(不仅仅是概念)
我觉得抽象类除了只能单继承(不如接口),其他完全可以代替接口啊,接口能干的,抽象类也能啊,为什么我们经常推荐使用接口,而不提倡说面向抽象类编程,接口和抽象类到底有哪些区别啊?求指教!!
[解决办法]
呵呵,有些东西可以互换,有些东西不能互换
就像我上面说滴
“我们只能说他本质是上人,只是实现了一些变态滴接口”
但是我们不好说
“他本质上就是变态,只是批了一幅人皮”(好吧虽然这句话也有人说,不过嘛你是知道滴,这个只是强调他是变态,而不是真滴说这厮根本上就是变态这种属滴)
[解决办法]
有很多事情其实你得自己去悟。
我不喜欢用什么生活中的事情打比喻,因为那样比喻越比越糟。我想说的是,当你用一种编程语言解决特定的编程任务的时候,你会有一些纯粹的需求,这种编程语言提供了这样的语法特性去满足这样的需求,这无法用什么好处、替换之类的去描述。就好比一个山洞里面跑出来的野蛮人跑到你家,什么都没有见过,盯着你问,碟子和碗相比有什么好处,筷子有什么好处之类的问题,你也很难去回答他一样。因为这个根本就不干好处的事。
你不是面向一种虚无缥缈的概念编程,你是面向一种实实在在的语言。接口这种语法特性不是必须的,C++没有,Go也没有,Javascript也没有。如果你要问“好处”,那是不是这些语言就不好了呢?不是这样。C#是一种静态的,强类型的语言,这意味着,当你调用一个对象的方法,编译器很在意你的对象是什么类型,它有没有这个方法,并且在编译阶段就将这种调用关系确定下来,即便是虚拟方法,也将查找虚拟方法的逻辑给确定下来。在这样一种语言上编程,你也必须很重视类型,你自然就有需求,需要一种方式表达一种类型,它拥有某种方法,用它代表一些具体的类型,而这些类型本身又没有任何关系,那么接口就是最好的选择。
你脱离了这个具体的场景,光根据比喻去理解,就发生问题了。我们说,js就没有接口。因为不需要。js是脚本语言,并不重视类型,如果一个对象有这样一个匹配的方法,那么它就可以被如此调用。对象自己描述了自己的类型,这就是弱类型语言的价值观。
你说哪一种正确呢?这个无解。特定的编程语言是为了解决特定的编程任务而设计的,同时也受到当时客观条件的制约。
[解决办法]