抽象类(abstract)

abstract修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用abstract修饰符以指示某个类只能是其它类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

è     抽象类不能实例化

è     抽象类可以包含抽象方法和抽象访问器

è     不能用sealed修饰符修改抽象类,这意味着抽象类不能被继承

è     从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现

看一段代码:

using System ;

abstract class A

{

protected int _x;

public abstract void F();

public abstract int X

{

get;set;

}

}

class B:A

{

public override void F()

{

}

public override int X

{

get

{

return _x;

}

set

{

_x=value ;

}

}

}

class Test

{

static void Main()

{

B b=new ();

b.X = 10;

Console .WriteLine (b.X );

}

}

->抽象方法是隐式的虚方法

->只允许在抽象类中使用抽象方法声明

->因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号({}),实现由一个重写方法提供,此重写方法是非抽象类的成员。

->在抽象方法声明中使用static或virtual修饰符是错误的。

->除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。

->在静态属性上使用abstract修饰符是错误的。

->在派生类中, 通过包括使用override修饰符的属性声明,可以重写抽象的继承属性。

抽象类的构造函数:

任何情况下,抽象类都不应进行实例化,因此,正确定义其构造函数就非常重要。确保抽象类功能的正确性和扩展性也很重要。下列准则有助于确保抽象类能够正确地设计并在实现后可以按预期方式工作。

->不要在抽象类型中定义公共的或受保护的内部构造函数,具有public或protected internal可见性的构造函数用于能进行实例化的类型。任何情况下抽象类型都不能实例化。

->应在抽象类中定义一个受保护(protected)构造函数或内部(private)构造函数。

->如果在抽象类中定义一个受保护构造函数,则在创建派生类的实例时,基类可执行初始化任务。

再看一段代码:

using System ;

abstract class Employee

{

protected string _name;

protected Employee () {}

protected Employee (string name)

{

_name = name ;

}

public abstract void StartWork();

}

class Manager:Employee

{

public Manager (string name):base (name){}

public override void StartWork()

{

//base .StartWork ();

Console .WriteLine (_name +"Ï´ïÈÎÎñ");

}

}

class Seller:Employee

{

public Seller (string name):base (name){}

public override void StartWork()

{

//base .StartWork ();

Console .WriteLine (_name +"ÏúÊÛ²úÆ·");

}

}

class Test

{

static void Main()

{

Employee [] emp = new Employee[2] ;

emp [0]=new Manager ("ÕÅÈý");

emp [1]=new Seller ("ÀîËÄ");

foreach (Employee e in emp )

{

e.StartWork ();

}

}

}

当所有的子类都要实现一些共同的功能的时候,这时顷向于使用虚方法,我们可以把这些共同的功能定义在基类中,子类通过base调用。如果所有子类的方法各不相干,则使用抽象方法。

抽象方法和虚拟方法的区别:

->抽象方法和虚拟方法的区别在于: 虚拟方法有一个实现部分,并为派生类提供了覆盖该方法的选项,相反,抽象方法没有提供实现部分,强制派生类覆盖方法(否则派生类不能成为具体类)。

->abstract方法只能在抽象类中声明,虚方法则不是。

->abstract方法必须在派生类中重写,而virtual则不必

->abstract方法不能声明方法实体, 虚方法则可以、

->包含abstract方法的类不能被实例化,而包含virtual的类则可以。

抽象类(abstract)【转】的更多相关文章

  1. php中的抽象类(abstract class)和接口(interface)

    一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...

  2. PHP的接口类(interface)和抽象类(abstract)的区别

    <?php /** * 接口类:interface * 其实他们的作用很简单,当有很多人一起开发一个项目时,可能都会去调用别人写的一些类, * 那你就会问,我怎么知道他的某个功能的实现方法是怎么 ...

  3. JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展

    JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来 ...

  4. [PHP] 抽象类abstract的回顾

    1.abstract定义为抽象的类不能被实例化. 2.它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的. 3.被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实 ...

  5. C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较

    由于C++和Java都是面向对象的编程语言,它们的多态性就分别靠虚函数和抽象函数来实现. C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针 ...

  6. 高级类特性----抽象类(abstract class)

    抽象类(abstract class) 随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用.类的设计应该保证父类和子类能够共享特征.有时将一个父类设计得非常抽象,以至于它没有具 ...

  7. Java中的抽象类abstract

    abstract定义抽象类 abstract定义抽象方法,只需要声明,不需要实现 包含抽象方法的类是抽象类 抽象类中可以包含抽象方法,也可以包含普通方法 抽象类不能直接创建,可以定义父类引用变量指向子 ...

  8. Day06_30_抽象类(Abstract)

    抽象类 Abstract 什么是抽象类? 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就 ...

  9. c#中抽象类(abstract)和接口(interface)的相同点与区别

    相同点: 1.都可以被继承 2.都不能被实例化 3.都可以包含方法声明 4.派生类必须实现未实现的方法 区别: 1.抽象基类可以定义字段.属性.方法实现.接口只能定义属性.索引器.事件.和方法声明,不 ...

  10. C# 抽象类abstract

    不能初始化的类被叫做抽象类,它们只提供部分实现,但是另一个类可以继承它并且能创建它们的实例,有未被实现的方法.抽象类不可以new对象. "一个包含一个或多个纯虚函数的类叫抽象类,抽象类不能被 ...

随机推荐

  1. Python 函数之lambda、map、filter和reduce

    1.lambda函数 lambda()是Python里的匿名函数,其语法如下: lambda [arg1[, arg2, ... argN]]: expression 学习条件运算时,对于简单的 if ...

  2. 解决 No module named PyQt5.QtWebKitWidgets

    原因:在 PyQt 5.6(+) 版本中, 新增 QtWebEngineWidgets 代替QtWebKitWidgets. 示例代码:#coding: utf-8 import sysfrom Py ...

  3. 在MySQL中设置事务隔离级别有2种方法:

    在MySQL中设置事务隔离级别有2种方法: 1 在my.cnf中设置,在mysqld选项中如下设置 [mysqld] transaction-isolation = READ-COMMITTED 2 ...

  4. 使用case语句给字体改变颜色

    使用case语句给字体改变颜色 #!/bin/bash color(){ RED_COLOR='\E[1;31m' GREEN_COLOR='\E[1;32m' YELLOW_COLOR='\E[1; ...

  5. Machine Learning的Python环境设置

    Machine Learning目前经常使用的语言有Python.R和MATLAB.如果采用Python,需要安装大量的数学相关和Machine Learning的包.一般安装Anaconda,可以把 ...

  6. Spring Boot 集成Swagger2生成RESTful API文档

    Swagger2可以在写代码的同时生成对应的RESTful API文档,方便开发人员参考,另外Swagger2也提供了强大的页面测试功能来调试每个RESTful API. 使用Spring Boot可 ...

  7. 如何平衡MMO游戏

    转自:http://blog.sina.com.cn/s/blog_9f56a65f01013eti.html 前言 这是一篇出自国外博客“Elder Game”的一篇文章,笔者觉得里面很多东西说的很 ...

  8. IOS 屏幕尺寸

    型号 屏幕尺寸(英寸) 分辨率(pt) 像素分辨率(px)iPhone 3G 3.5 320*480 480x320iPhone 3GS   3.5 320*480 480x320iPhone4 3. ...

  9. Shell编程进阶 2.1 shell函数

    函数 vim fun.sh #!/bin/bash function mysum() { sum=$[$+$] echo $sum } a= b= mysum $a $b sh fun.sh 6 可以 ...

  10. Android Tombstone 分析

    1.什么是tombstone 当一个动态库(native 程序)开始执行时,系统会注册一些连接到 debuggerd 的 signal handlers,当系统 crash 的时候,会保存一个 tom ...