抽象类[abstract]_C#
抽象类(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 ();
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]_C#的更多相关文章
- php中的抽象类(abstract class)和接口(interface)
一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...
- PHP的接口类(interface)和抽象类(abstract)的区别
<?php /** * 接口类:interface * 其实他们的作用很简单,当有很多人一起开发一个项目时,可能都会去调用别人写的一些类, * 那你就会问,我怎么知道他的某个功能的实现方法是怎么 ...
- JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展
JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来 ...
- [PHP] 抽象类abstract的回顾
1.abstract定义为抽象的类不能被实例化. 2.它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的. 3.被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实 ...
- C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较
由于C++和Java都是面向对象的编程语言,它们的多态性就分别靠虚函数和抽象函数来实现. C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针 ...
- 高级类特性----抽象类(abstract class)
抽象类(abstract class) 随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用.类的设计应该保证父类和子类能够共享特征.有时将一个父类设计得非常抽象,以至于它没有具 ...
- Java中的抽象类abstract
abstract定义抽象类 abstract定义抽象方法,只需要声明,不需要实现 包含抽象方法的类是抽象类 抽象类中可以包含抽象方法,也可以包含普通方法 抽象类不能直接创建,可以定义父类引用变量指向子 ...
- Day06_30_抽象类(Abstract)
抽象类 Abstract 什么是抽象类? 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就 ...
- c#中抽象类(abstract)和接口(interface)的相同点与区别
相同点: 1.都可以被继承 2.都不能被实例化 3.都可以包含方法声明 4.派生类必须实现未实现的方法 区别: 1.抽象基类可以定义字段.属性.方法实现.接口只能定义属性.索引器.事件.和方法声明,不 ...
随机推荐
- 判断sqlserver临时表等临时资源是否存在
if exists(select * from tempdb..sysobjects where id=object_id('tempdb..#TEMP')) drop table #TEMP
- Windows下载Android源代码
下载msysgit,安装 官方下载:http://code.google.com/p/msysgit/downloads/list, 打开Git Bash,运行命令 cd D: git clone h ...
- 解决IE下jquery ajax无法获得最新数据的问题(IE缓存)
今天修改一个bug,利用ajax查询数据,在谷歌浏览器下可以获取到最新数据,而在IE中获得是旧数据,无法获得最新的数据,经查资料,才发现时IE缓存再作怪. 发现此ajax请求用的get方式,每次请求的 ...
- Asp.net 使用正则和网络编程抓取网页数据(有用)
Asp.net 使用正则和网络编程抓取网页数据(有用) Asp.net 使用正则和网络编程抓取网页数据(有用) /// <summary> /// 抓取网页对应内容 /// </su ...
- xtrabackup进行物理备份、恢复、在线克隆从库、在线重做主从
http://www.lai18.com/content/4733997.html 注:图片来自<深入浅出MySQL 数据库开发 优化与管理维护 第2版> 物理备份和恢复 1.冷备份:停掉 ...
- linux 进程地址空间的一步步探究
我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间.其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间. 那虚拟内存空间 ...
- Android基本控件之GridView
我们在使用手机的过程中,会看到一些图片配上文字的一些情况,今天我们就来介绍一下安卓控件的GridView GridView组件用来以网格方式排列视图,与矩阵类似,当屏幕上有很多元素(文字.图片或其他元 ...
- FE—— Code First 初体验 01(转)
EF Code First 初体验 Code First 顾名思义就是先代码,再由代码生成数据库的开发方式. 废话不多说,直接来一发看看:在VS2010里新建一个空白解决方案,再依次添加两个类库项 ...
- css笔记11:选择器练习
1. (1)exam1.css文件: .s1 { font-size: 50px; color: blue; } .s2 { backgoround:gray; font-style: italic; ...
- Objective-C ,ios,iphone开发基础:3分钟教你做一个iphone手机浏览器
第一步:新建一个Single View工程: 第二步:新建好工程,关闭arc. 第三步:拖放一个Text Field 一个UIButton 和一个 UIWebView . Text Field 的ti ...