日期:2014-05-18  浏览次数:20843 次

真心求指教,抽象类和接口到底有什么用呢?
为什么非要去定义这些东西啊?与其继承了这些东西然后再去实现他们,为什么不直接去实现这些想要的方法呢?
小白求大家指教啊~~~~


------解决方案--------------------
一个是为了约束,共同开发的时候用的多。
你有时间看看设计模式,我现在的项目要用SSH,发现作用还是很大的。
------解决方案--------------------
你去看看设计模式里面的工厂模式,你就懂了。
------解决方案--------------------
探讨

引用:

唉,这种冷饭炒了又炒,
等你代码量海了后,自然会明白它们的作用,
努力点一年就能摸到皮毛,
精通就不是一时半会了,
当然只会复制粘贴可能永远无法明白了

这位大牛着实打击我个半死啊- -
我只是觉着学了那么多语法的东西总要用的吧,可是不知道啥时候用为啥要用,所以想问问。。。。
我是在自己写个东西,以前没有写的从没用过接口啥的(别鄙视我啊,我觉着哪个……

------解决方案--------------------
你做的项目以后有可能业务扩展,用接口去定义,以后扩展的时候很方便。

------解决方案--------------------
接口可以理解为标准
比如说 我们的插座 市面上所有的电器不是两孔就是三孔 不可能来个一孔或者四孔 这就是为了和插座兼容 这样子插座才可以给你供电 这里可以理解为外部针对接口的调用 但是具体这个电给你了你怎么用 那就是电器自身的事情 这里你就可以理解为实现了接口的类
用代码表示就是
C# code
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(开放关闭原则)。

那么接口、抽象类的作用是什么呢?它就是使得你的代码符合这个原则:

我们看这么一个场景,我们编写的程序提供了日志输出的功能:

C# code
foo()
{
    ...
    try
    {
        ...
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    ...
}

------解决方案--------------------
其实好比工厂里的模具,直接做一个模型和按照模具来做一个模型,一个适于批量生产,一个适于做一个样品。
你写的类也是,如果不用接口或抽象类,说明这个类是独特的类,而用到了接口或抽象类,说明这个类有其它类似的类存在,需要一个接口或抽象类来规范他们的相同之处。
------解决方案--------------------
简单点:
接口:物种(必须有呼吸方法,但是不确定是如何呼吸的。)
抽象:动物(实现呼吸方法,知道如何呼吸了吧)
实际:人类(继承呼吸方法,直接拿来就是)
------解决方案--------------------
接口只是一种标准约束。比如说,我们使用的电脑,显示器可以购买不通厂商的,鼠标键盘也可以,包括内部配件硬盘,显卡等等,为什么呢?因为它们遵循了共同制定的接口。不管内部怎么做,与外界对接的接口是大家公共定义的,你只要遵循这个标准,就可以通用了。
抽象类:抽象类比接口多了一些细则的东西,比如抽象类可以实现一些方法,定义一些属性。比如说,我们现在的手机CPU有单核,双核,四核的。基本上都是基于ARM架构的,那么你肯定问,手机的cpu是ARM出产的吗?不是,ARM只是做CPU架构,然后其它厂家购买这种架构生成基于这种架构的CPU,所以我们手机里面有三星的,高通的,但是架构都大同小异。所以对于生产厂家来说,ARM就是抽象类,而具体的生产厂家就是实现类

表达能力不是很好,这个问题面试的时候经常问到。我是觉得以个人的理解讲解比搬标准的定义要好一些。
------解决方案--------------------
哥们,这是我以前总结的,不知道是否完全正确,不正确的地方,请大家指正,谢谢。

抽象类:
含义: 声明方法的存在而不去实现它的类被叫做抽象类(abstract class)
方法名修饰符: abstract
实例化: 不能创建抽象类的实例
实现: 可以有选择性地实现需要用到的方法(即重写)
是否能包含已实现的方法: 可以,即不一定要求所有方法都是抽象的
继承: 单