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对象. "一个包含一个或多个纯虚函数的类叫抽象类,抽象类不能被 ...
随机推荐
- codeforces #364a Cards
cf的a题没什么好说到,100的量级,每个人给2张牌,使每个人手中的牌点数相等.保证有一种分配方案. 对每个人,先计算出手中的牌的点数,然后循环两遍拿牌就可以. A. Cards time lim ...
- DataUml Design 教程6-DataUML Design 1.1版本正式发布(支持PD数据模型)
从DataUML Design正式发布到现在有两个月了,由于最近比较忙,到现在才发布1.1版本.以后本人会一直坚持不断完善DataUML Design软件,希望广大程序猿们多多支持. 一.1.1版本新 ...
- 配置linux服务器和pycharm的连接
1.打开pyCharm Tools->Deployment->Configuratio Connecion ->Root Path: /home/admin/application/ ...
- 微信蓝牙ble记录
参加了一个简单的微信蓝牙ble项目,做一些记录 首先按网站上面的各种配置 简单的说就是,软件上面,生成deviceid->绑定设备和deviceid. 几点注意: 1>deviceid是唯 ...
- android开发的权限获取 (转载的)
访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permiss ...
- 简简单单删除所有.svn目录
当使用了svn版本控制系统后每个目录下都会有一个.svn目录存在,开发完当交付产品或者上传到服务器时一般要把这些目录删除,其实在linux删除这些目录是很简单的,命令如下 find . -type d ...
- SVN如何新建用户并分配权限
打开SVN服务端,找到特定的项目目录,单击右键,然后点击属性: 在弹出的页面中,点击增加: 在增加的页面中,你可以选择之前已经创建的用户,也可以重新创建用户名和密码: 如果是选择已经有的用 ...
- jvm(13)-线程安全与锁优化
[0]README 0.1)本文部分文字转自“深入理解jvm”, 旨在学习 线程安全与锁优化 的基础知识: 0.2)本文知识对于理解 java并发编程非常有用,个人觉得,所以我总结的很详细: [1]概 ...
- poj 2112(二分+多重匹配)
题目链接:http://poj.org/problem?id=2112 思路:由于要求奶牛走的最远距离的最短路程,显然我们可以二分距离,如果奶牛与挤奶器的距离小于等于limit的情况下,能够满足,则在 ...
- ios - 上下滚动的新闻
#import <UIKit/UIKit.h> @interface ScrollUpDownView : UIView //设置 要现实的文字 @property(nonatomic, ...