日期:2014-05-18 浏览次数:20843 次
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
实例化: 不能创建抽象类的实例
实现: 可以有选择性地实现需要用到的方法(即重写)
是否能包含已实现的方法: 可以,即不一定要求所有方法都是抽象的
继承: 单