一、抽象类
抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。
注意:
1.抽象方法,必须存在于抽象类当中。相反,抽象类中不一定全部是抽象方法。
2.抽象方法没有方法体,继承了抽象类的子类,必须实现父类的所有的抽象方法。
3.抽象类可以被实例化,但不能通过普通的实例化new,它只能通过父类的应用指向子类的实例来间接的实例化子类。如:
Person t = new Teacher();
二、接口
接口是引用类型的,类似于类,接口内包含的全部是未实现的方法,而且接口类和方法的关键词不需要再声明abstract。和抽象类的相似之处有三点:
1.不能实例化;
2.包含未实现的方法声明;
3.派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
另外,接口有如下特性:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。
除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。
三、抽象类和接口的相同点和不同点
不同点:接口不包含方法的实现,抽象类可以包含,也可以不包含,不包含时非抽象方法时{}必须保留。
接口可以多继承,类只能单继承。
类定义可在不同的源文件之间进行拆分。
相同点:都不能进行实例化,必须通过继承实现其抽象方法。
接口、类和结构都可以从多个接口继承。
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
接口和类都可以包含事件、索引器、方法和属性。
四、代码案例
抽象类:
namespace ClassDemo1 { #region 类 public abstract class Person { //函数即使对象的动作 public void Breath() { //空方法体 } public void Name() { Console.WriteLine("人人都有姓名!"); } public virtual void Drink() // 注意virtual,表明这是一个虚拟函数 { Console.WriteLine("人是要喝水的!"); } public void Eat() { Console.WriteLine("人是要吃饭的!"); } public void Sleep() { Console.WriteLine("人是要睡觉的!"); } } public class Teacher :Person { //重定义父类方法 public new void Eat() { Console.WriteLine("教师是人,也是要吃饭的!"); } //重写父类方法 public override void Drink() { Console.WriteLine("教师是人,也是要喝水的!"); } //自己独有方法(动作) public void Teach() { Console.WriteLine("教师的义务是要进行教授课程!"); } } #endregion //测试 class Program { static void Main(string[] args) { Teacher t = new Teacher(); t.Breath(); t.Name(); t.Drink(); t.Eat(); t.Sleep(); t.Teach(); Console.ReadKey(); } } }
接口:
namespace InterfaceDemo1 { #region 接口 //不能进行实例化,只能通过继承实现其抽象方法 //还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。 //除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。 //定义学生接口 public interface IStudent { //未实现的方法声明; void study_base(); } //定义职员接口 public interface IEmployee { void work(); } //定义计算机类学生接口 public interface IIStudent : IStudent { void study_computer(); } //接口能实现多继承,子类必须实现继承接口的所有方法 public class Infostudent : IEmployee, IIStudent { //实现学生接口 public void study_base() { Console.WriteLine("数学、语文和英语必须学好"); } //实现职员接口 public void work() { Console.WriteLine("工作必须完成"); } //实现计算机类学生接口 public void study_computer() { Console.WriteLine("计算机类的学生除学好基础课外,还要学C#"); } //自己定义的方法 public void play_game() { Console.WriteLine("计算机类的学生除学好基础课外和学C#外,还喜欢打游戏"); } } #endregion //测试 class Program { static void Main(string[] args) { //派生与接口的学生类 Infostudent infostudent = new Infostudent(); infostudent.study_base(); infostudent.work(); infostudent.study_computer(); //学生自己独有的方法 infostudent.play_game(); Console.ReadKey(); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?