真心求指教,抽象类和接口到底有什么用呢?
为什么非要去定义这些东西啊?与其继承了这些东西然后再去实现他们,为什么不直接去实现这些想要的方法呢?
小白求大家指教啊~~~~
[解决办法]
一个是为了约束,共同开发的时候用的多。
你有时间看看设计模式,我现在的项目要用SSH,发现作用还是很大的。
[解决办法]
你去看看设计模式里面的工厂模式,你就懂了。
[解决办法]
public interface IChaKong//插孔接口{ void Enpower()//给电}public class TV:IChaKong{ public void Enpower() { //放电视的操作 }}public class AirCondition:IChaKong{ public void Enpower() { //空调制冷或者制冷的操作 }}public class ChaZuo()//假设一个插座类(准确说应该是个接线板) 他包含三个插孔接口类型的变量{ List<IChaKong> chaKongs=new List<IChaKong>(); public void Enpower()//这个相当于是把插座接上电 { foreach(var temp in chaKongs) { temp.Enpower()//接口的方法 对于插座而言不知道插在插孔上的电器具体是在干什么 } }}public class Program{ public static Main() { var chaZuo=new ChaZuo(); chaZuo.chaKongs.Add(new TV())//相当于给插孔插上一个电视 chaZuo.chaKongs.Add(new AirCondition())//相当于插了一个空调 chaZuo.Enpower()//把接线板插到电源上 }}
[解决办法]
楼上很多人说了半天一会儿让lz看这个,一会儿让lz领悟那个,估计lz晕了。
其实没有那么高深,几句话就能说清楚。
问lz几个问题
(1)如果我写一个代码交给lz维护,你是愿意在我的代码中改来改去呢,还是直接再按照一定规则编写一段代码来扩展呢?
(2)如果lz是一个框架库的编写者(这听上去有点高级),你的用户不再是最终用户,而是一些初级程序员,你如何让他们觉得你的框架库好用。比如你的框架库应该适应尽可能多的情况(这些情况你不能一一预料到并且写在代码中),同时还要避免他们修改你的代码(你的代码已经编译成dll了)。
也许具体怎么做你不知道,但是看了我的两点,原则你已经知道了,那就是你编写的代码必须对功能的扩展开放(允许他们扩展功能),同时对修改关闭(程序本身不应该被修改,就像你不会随便修改System.Data,System.Web中的代码,实际上也没有代码给你修改)。
这个原则很多程序员已经意识到了,于是简称为OCP(开放关闭原则)。
那么接口、抽象类的作用是什么呢?它就是使得你的代码符合这个原则:
我们看这么一个场景,我们编写的程序提供了日志输出的功能:
foo(){ ... try { ... } catch (Exception ex) { Console.WriteLine(ex.Message); } ...}
[解决办法]
其实好比工厂里的模具,直接做一个模型和按照模具来做一个模型,一个适于批量生产,一个适于做一个样品。
你写的类也是,如果不用接口或抽象类,说明这个类是独特的类,而用到了接口或抽象类,说明这个类有其它类似的类存在,需要一个接口或抽象类来规范他们的相同之处。
[解决办法]
简单点:
接口:物种(必须有呼吸方法,但是不确定是如何呼吸的。)
抽象:动物(实现呼吸方法,知道如何呼吸了吧)
实际:人类(继承呼吸方法,直接拿来就是)
[解决办法]
接口只是一种标准约束。比如说,我们使用的电脑,显示器可以购买不通厂商的,鼠标键盘也可以,包括内部配件硬盘,显卡等等,为什么呢?因为它们遵循了共同制定的接口。不管内部怎么做,与外界对接的接口是大家公共定义的,你只要遵循这个标准,就可以通用了。
抽象类:抽象类比接口多了一些细则的东西,比如抽象类可以实现一些方法,定义一些属性。比如说,我们现在的手机CPU有单核,双核,四核的。基本上都是基于ARM架构的,那么你肯定问,手机的cpu是ARM出产的吗?不是,ARM只是做CPU架构,然后其它厂家购买这种架构生成基于这种架构的CPU,所以我们手机里面有三星的,高通的,但是架构都大同小异。所以对于生产厂家来说,ARM就是抽象类,而具体的生产厂家就是实现类
表达能力不是很好,这个问题面试的时候经常问到。我是觉得以个人的理解讲解比搬标准的定义要好一些。
[解决办法]
哥们,这是我以前总结的,不知道是否完全正确,不正确的地方,请大家指正,谢谢。
抽象类:
含义: 声明方法的存在而不去实现它的类被叫做抽象类(abstract class)
方法名修饰符: abstract
实例化: 不能创建抽象类的实例
实现: 可以有选择性地实现需要用到的方法(即重写)
是否能包含已实现的方法: 可以,即不一定要求所有方法都是抽象的
继承: 单
接口:
含义: 抽象类的变体
方法名修饰符: abstract
实例化: 不能创建接口的实例
实现: 必须实现所有的方法(即重写)
是否能包含已实现的方法: 不可以,即一定要求所有方法都是抽象的
继承: 多
[解决办法]
我认为每个编程的人或多或少都玩游戏吧,我举个简单例子。
大多数游戏都有多种职业,那么你需要定义一个职业的interface,这个interface中有一个方法attack。
那么你的程序在执行的时候,对于所有职业来说都有attack这个方法,是不是简单多了?如果你是每个类都去单独实现的话,那么你必须将每个职业都设置一个attack的方法,这样你的程序才好写,也许我说明不是很好,但是大致意思就是所有职业因为继承了职业的interface,那么他们都有一个统一的attack方法,也就是标准。
抽象类的话,跟interface差的不是很多,抽象类的子类必须实现抽象类中的抽象成员,否则编译不通过。
这样说,如果你写了一个类,其中有一个方法fun。你知道了你写的类将会被别人拿去继承,但是你又担心别人写的子类中不会去实现fun方法,也fun方法将在你的程序中是一个不可缺少的方法,那么你只需要将fun设置为抽象的就可以了,那么别人继承你的类的时候,fun方法必须实现了,那么你的主程序中调用fun的时候就不会出现调用了null方法的问题。