黑马程序员技术交流社区

标题: c# [打印本页]

作者: 568839480    时间: 2013-12-31 10:58
标题: c#
本帖最后由 568839480 于 2014-1-3 12:49 编辑

抽象类的意义

作者: 一席倾城    时间: 2013-12-31 11:45
抽象类可以理解为人类对未知事物,也就是一个未知工程的原始框架,根据他来派生出活生生的具体的类.有这些具体的类在派生出新的类来适应新的要求.
作者: 如远行客    时间: 2014-1-1 09:36
抽象类相当于一个规范,它规定了某些类型所具有的特性,它可以说是类的抽象,继承自抽象类的子类说明其具有这些性质,那么,这个子类就必须实现抽象类中的所有抽象成员。就像我们生活中的那些标准,使用产品的人不会去关注相关的标准,但是生产商品的企业在生产时必须要执行相关的标准,这些标准规定了产品的各种指标,只有执行了标准这个产品才是达标的,才能进入市场。抽象类就相当于这种标准。
作者: qly2046    时间: 2014-1-1 10:29
它是一个未实现定义的接口,你可以根据自己的需要对抽象类进行定义.抽象类只能作为其它类的基类.
作者: 卖火柴    时间: 2014-1-1 11:18
抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。
作者: liulinaxue    时间: 2014-1-1 21:34
根据里氏代换原则,子类可以替代父类。使用抽象类
作者: liulinaxue    时间: 2014-1-1 21:37
使用抽象类/接口更具有稳定性,可以通过拓展子类,保证“开放-封闭原则”(对拓展开放,对修改封闭)
----------现学现卖了
作者: lei130102    时间: 2014-1-2 11:40
1.
--抽象类不能实例化
--抽象类可以包含抽象方法和抽象访问器(如抽象属性)。
--抽象类可以有构造函数(没有抽象构造函数,抽象静态方法)
--抽象类可以有字段
抽象类的用途是提供多个派生类可共享的基类的公共定义。例如,类库可以定义一个作为其多个函数的参数的抽象类,并要求程序员使用该库通过创建派生类来提供自己的类实现。
如果希望禁止通过 new 关键字直接进行实例化,可以将类声明为 abstract。如果这样做,则仅当从该类派生新类时才能使用该类。
  1. abstract class BaseClass   // Abstract class
  2. {
  3.     protected int _x = 100;
  4.     protected int _y = 150;
  5.     public abstract void AbstractMethod();   // Abstract method
  6.     public abstract int X    { get; }
  7.     public abstract int Y    { get; }
  8. }
复制代码

2.
--抽象方法没有实现(所以方法定义后面是分号,而不是常规的方法块)
--如果某个类包含抽象成员,则该类自身必须声明为抽象类
--在抽象方法声明中使用 static 或 virtual 修饰符是错误的(抽象方法是隐式的虚方法, 在静态属性上使用 abstract 修饰符是错误的)
--不要在抽象类型中定义公共的(public)或受保护的内部(protected internal)构造函数。应在抽象类中定义一个受保护构造函数(protected)或内部构造函数(internal)。(具有 public 或 protected internal 可见性的构造函数用于能进行实例化的类型。任何情况下抽象类型都不能实例化)
  1. public abstract class A
  2. {
  3.     public abstract void DoWork(int i);
  4. }
复制代码


3.
--抽象类的派生类必须实现所有抽象方法。
--实现由一个重写方法override提供,此重写方法是非抽象类的一个成员。
  1. abstract class WashingMachine
  2. {
  3.    protected WashingMachine()//构造函数
  4.    {
  5.       // Code to initialize the class goes here.
  6.    }

  7.    abstract public void Wash();
  8.    abstract public void Rinse(int loadSize);
  9.    abstract public long Spin(int speed);
  10. }
复制代码


在上面的示例中,用一个已实现的方法和三个未实现的方法声明抽象类。从该类继承的类必须实现 Wash、Rinse 和 Spin 方法。下例显示了该类实现的可能形式:
  1. class MyWashingMachine : WashingMachine
  2. {
  3.    public MyWashingMachine()
  4.    {
  5.       // Initialization code goes here.   
  6.    }
  7.    override public void Wash()
  8.    {
  9.       // Wash code goes here.
  10.    }
  11.    override public void Rinse(int loadSize)
  12.    {
  13.       // Rinse code goes here.
  14.    }
  15.    override public long Spin(int speed)
  16.    {
  17.       // Spin code goes here.
  18.    }
  19. }
复制代码


4.
当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。
  1. // compile with: /target:library
  2. public class D
  3. {
  4.     public virtual void DoWork(int i)
  5.     {
  6.         // Original implementation.
  7.     }
  8. }

  9. public abstract class E : D
  10. {
  11.     public abstract override void DoWork(int i);
  12. }

  13. public class F : E
  14. {
  15.     public override void DoWork(int i)
  16.     {
  17.         // New implementation.
  18.     }
  19. }
复制代码


如果将virtual方法声明为abstract,则该方法对于从抽象类继承的所有类而言仍然是虚方法。继承抽象方法的类无法访问该方法的原始实现。在前面的示例中,类 F 上的 DoWork 无法调用类 D 上的 DoWork。在此情况下,抽象类可以强制派生类为虚方法提供新的方法实现。
5.
抽象类必须为所有接口成员提供实现。实现接口的抽象类可以将接口方法映射到抽象方法上。
  1. interface I
  2. {
  3.     void M();
  4. }
  5. abstract class C : I
  6. {
  7.     public abstract void M();
  8. }
复制代码



作者: 师弟    时间: 2014-1-3 02:14
从面向对象的角度:现实世界中有抽象事物,所以面向对象语言中也存在抽象,如(人,动物),只有抽象的意思,没有确定到那个实物,它只是其他类一般的模型。从程序设计角度:有利于更好的设计代码,使程序更加合理,更具逻辑性,利于开发。纯属个人对面向对象的理解……




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2