抽象类
简述:抽象类和抽象方法的好处是实现多态,最简单的一个作用是实现模板,方便调用和重写及扩展性。
1、定义抽象类
具体语法格式如下
访问修饰符 abstract class 类名:基类/接口 { 处理语句块; }
抽象类特点
- 抽象类不能被直接实例化,并且在使用new 运算符时会导致编译错误。
- 允许抽象类包含抽象成员
- 抽象类不能被密封(抽象成员不能私有)
- 抽象类派生一个非抽象类时,需要在非抽象鳄梨中重写抽象方法,以便实现特定功能。
- 通过关键字abstract定义的类称为抽象类
具体实现看上篇多态的抽象类部分
2、抽象方法
简述:声明抽象方法时需要注意:抽象方法必须声明在抽象类中,声明抽象方法时,不需要使用virtual、static、private修饰。在抽象类中的抽象方法不提实现,没有方法体。
抽象方法特点
- 一个抽象方法可以看作是一个虚函数
- 抽象方法的声明只能在抽象类中
- 抽象方法声明只提供一个无实现的方式,没有方法体
- 抽象方法体的实现被覆盖方法提供、覆写方法是一个非抽象方法的成员
- 抽象实现的行为和抽象方法相似
- 在一个静态属性中使用abstract是一个错误
具体实现看上篇多态的抽象类部分
示例:抽象类和抽象方法
完整代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace ConsoleApplication1 8 { 9 public class 面向对象设计_小狗和企鹅 10 { 11 /// <summary> 12 /// Main方法,程序执行入口 13 /// </summary> 14 /// <param name="age"></param> 15 public static void Main(string[] age) 16 { 17 Dog dog = new Dog("旺财", 90, 100, StrainEnum.聪明的布拉达多); 18 dog.GetPint(); 19 Penguin pen = new Penguin("小企", 80, 80, SexEnum.Q仔); 20 pen.GetPint(); 21 Console.ReadLine(); 22 23 //Dog dog = new Dog(); 24 //dog.GetPint(); 25 //Penguin pen = new Penguin(); 26 //pen.GetPint(); 27 //Console.ReadLine(); 28 29 //抽象类[] Classs = { 30 // new Dog("旺财", 90, 100, StrainEnum.聪明的布拉达多), 31 // new Penguin("小企", 80, 80, SexEnum.Q仔) 32 // }; 33 34 //foreach (抽象类 Cls in Classs) 35 //{ 36 // Cls.GetPint(); 37 //} 38 //Console.ReadLine(); 39 } 40 41 /// <summary> 42 /// 抽象类 43 /// </summary> 44 public abstract class 抽象类 45 { 46 /// <summary> 47 /// 字段 48 /// </summary> 49 public string name; 50 public int health; 51 public int love; 52 53 /// <summary> 54 /// 属性 55 /// </summary> 56 public string Name 57 { 58 get{return name;} 59 set{name=value;} 60 } 61 public int Health 62 { 63 get{return health;} 64 set{health=value;} 65 } 66 public int Love 67 { 68 get{return love;} 69 set{love=value;} 70 } 71 /// <summary> 72 /// 带参构造函数 73 /// </summary> 74 /// <param name="name"></param> 75 /// <param name="health"></param> 76 /// <param name="love"></param> 77 public 抽象类(string name,int health,int love) 78 { 79 this.name=name; 80 this.health=health; 81 this.love=love; 82 } 83 public 抽象类() 84 { 85 } 86 /// <summary> 87 /// 抽象方法 88 /// </summary> 89 public abstract void GetPint(); 90 } 91 92 /// <summary> 93 /// 小狗 94 /// </summary> 95 public class Dog:抽象类 96 { 97 public StrainEnum strain; 98 public StrainEnum Strain 99 { 100 get{return strain;} 101 set{strain=value;} 102 } 103 /// <summary> 104 /// 狗狗构造函数 105 /// </summary> 106 public Dog() 107 { } 108 public Dog(string name,int health,int love,StrainEnum strain):base(name,health,love) 109 { 110 this.strain=strain; 111 } 112 113 public override void GetPint() 114 { 115 Console.WriteLine("昵称:{0},品种:{1},健康值:{2},亲密度:{3}",base.name,this.strain,base.health,base.love); 116 } 117 } 118 119 /// <summary> 120 /// 企鹅类 121 /// </summary> 122 public class Penguin:抽象类 123 { 124 public SexEnum sex; 125 public SexEnum Sex 126 { 127 get{return sex;} 128 set{sex=value;} 129 } 130 /// <summary> 131 /// 企鹅构造函数 132 /// </summary> 133 public Penguin() 134 { } 135 public Penguin(string name,int health,int love,SexEnum sex):base(name,health,love) 136 { 137 this.sex=sex; 138 } 139 140 public override void GetPint() 141 { 142 Console.WriteLine("昵称:{0},性别:{1},健康值:{2},亲密度:{3}",base.name,this.sex,base.health,base.love); 143 } 144 } 145 146 /// <summary> 147 /// 狗品种枚举 148 /// </summary> 149 public enum StrainEnum 150 { 151 聪明的布拉达多=0, 152 酷酷的雪娜瑞=1 153 } 154 155 /// <summary> 156 /// 企鹅品种枚举 157 /// </summary> 158 public enum SexEnum 159 { 160 Q仔=0, 161 Q妹=1 162 } 163 164 } 165 }