c# 抽象类(abstract)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//抽象类(abstract)
//abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用abstract修饰符
//以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
//抽象类的特性
//1、抽象类不能实例化。
//2、抽象类可以包含抽象方法和抽象访问器。
//3、不能用 sealed 修饰符修改抽象类,这意味着抽象类不能被继承。
//4、从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现。
//抽象方法
//1、抽象方法是隐式的虚方法。
//2、只允许在抽象类使用抽象方法声明。
//3、因为抽象方法声明不提供实际的实现,所有没有方法体;方法声明只是以一个分号结束,
//并且在签名后没有大括号,实现由一个重写方法提供,此重写方法是非抽象类的成员。
//4、在抽象方法声明中使用static或virtual修饰符是错误的。
//5、除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。
//6、在静态属性上使用abstract修饰符是错误的。
//7、在派生类中,通过包括使用override修饰符的属性声明,可以重写抽象的继承属性。
namespace 抽象类
{
//定义一个抽象类
abstract class A
{
protected int _x;
//private abstract void F(); //报错!虚拟成员或抽象成员不能是私有的。
public abstract void F(); //声明一个抽象方法,抽象方法必须定义在抽象类中,并且方法中不能包含主体。
public abstract int X { get; set; } //声明一个抽象属性
}
class B : A
{
public override void F() //继承抽象类,必须重写抽象类中的抽象方法。
{
throw new NotImplementedException();
}
public override int X
{
get
{
return _x;
}
set
{
_x = value;
}
}
}
class Program
{
static void Main(string[] args)
{
//A a = new A(); //报错!1、抽象类不能实例化。
B b = new B(); //可以实例化
b.X = ;
Console.WriteLine(b.X);
Console.ReadKey();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace 抽象类1
{
//员工类
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) //赋值给基类(Employee)构造函数name
{ }
//重写虚方法
public override void StartWork() //使用虚方法实现面向对象的多态
{
Console.WriteLine(_name + "给员工下达任务");
}
}
//秘书类
class Secretary : Employee
{
public Secretary(string name) : base(name) { }
public override void StartWork()
{
Console.WriteLine(_name + "协助经理");
}
}
//销售类
class Seller : Employee
{
public Seller(string name) : base(name) { }
public override void StartWork()
{
Console.WriteLine(_name + "销售产品");
}
}
//财务类
class Accountant : Employee
{
public Accountant(string name) : base(name) { }
public override void StartWork()
{
Console.WriteLine(_name + "管理公司财政");
}
}
class Program
{
static void Main(string[] args)
{
Employee[] emp = new Employee[];
emp[] = new Manager("张三");
emp[] = new Secretary("李四");
emp[] = new Seller("王五");
emp[] = new Seller("马六");
emp[] = new Accountant("钱七");
Console.WriteLine("早上8点,开始工作");
foreach (Employee e in emp)
{
e.StartWork();
}
Console.ReadKey();
}
}
}
c# 抽象类(abstract)的更多相关文章
- 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.抽象基类可以定义字段.属性.方法实现.接口只能定义属性.索引器.事件.和方法声明,不 ...
- C# 抽象类abstract
不能初始化的类被叫做抽象类,它们只提供部分实现,但是另一个类可以继承它并且能创建它们的实例,有未被实现的方法.抽象类不可以new对象. "一个包含一个或多个纯虚函数的类叫抽象类,抽象类不能被 ...
随机推荐
- jstat -gcutil pid millsec
1. jstat -gc pid 可以显示gc的信息,查看gc的次数,及时间. 其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc ...
- iOS开发--用户点击频繁,多个异步网络请求取消问题?
一.业务环境描述 当一个view同时添加两个tableView为subView的时候,两个tableView分别为mainTable和subTable. 当用户点击mainTable上的某一条数据时, ...
- Sping 的 BeanFactory 容器
Sping 的 BeanFactory 容器 这是一个最简单的容器,它主要的功能是为依赖注入 (DI) 提供支持,这个容器接口在 org.springframework.beans.factory.B ...
- openCV中 libopencv-nonfree-dev的安装: undefined reference to `cv::initModule_nonfree()'
今天照着一起做RGB-D SLAM (3) , 程序会出现以下的错误: cv::initModule_nonfree(); /home/yhzhao/slam/src/detectFeature ...
- (转)Unity3D集成SVN进行版本控制
首先,AssetServer确实很好用,Unity内部集成的管理界面,操作很简单,提交冲突的后还可以进行文件比对.但学习使用过程中,发现文件体积较大的项目文件目录(600M),我提交不上去,会返回没有 ...
- Classification week2: logistic regression classifier 笔记
华盛顿大学 machine learning: Classification 笔记. linear classifier 线性分类器 多项式: Logistic regression & 概率 ...
- Python中的图像处理
第 1 章 基本的图像操作和处理 本章讲解操作和处理图像的基础知识,将通过大量示例介绍处理图像所需的 Python 工具包,并介绍用于读取图像.图像转换和缩放.计算导数.画图和保存结果等的基本工具.这 ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.1——编写自己的任务
问题: 你想用自己的任务定制gradle的构建过程. 解决方案: 在gradle的build文件里面增加task元素.用Android插件支持的extra属性使得开发更容易. 讨论: Gradle的D ...
- 常见的.NET面试题(130)
1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成 ...
- FZU 2099 魔法阵(计算几何)
Problem 2099 魔法阵 Accept: 120 Submit: 289 Time Limit: 1000 mSec Memory Limit : 32768 KB Probl ...