第13节、C#抽象类和抽象方法

抽象类

简述:抽象类和抽象方法的好处是实现多态,最简单的一个作用是实现模板,方便调用和重写及扩展性。

1、定义抽象类

具体语法格式如下

访问修饰符 abstract class 类名:基类/接口
{
 处理语句块;
}

  抽象类特点

  1. 抽象类不能被直接实例化,并且在使用new 运算符时会导致编译错误。
  2. 允许抽象类包含抽象成员
  3. 抽象类不能被密封(抽象成员不能私有)
  4. 抽象类派生一个非抽象类时,需要在非抽象鳄梨中重写抽象方法,以便实现特定功能。
  5. 通过关键字abstract定义的类称为抽象类

具体实现看上篇多态的抽象类部分

2、抽象方法

简述:声明抽象方法时需要注意:抽象方法必须声明在抽象类中,声明抽象方法时,不需要使用virtual、static、private修饰。在抽象类中的抽象方法不提实现,没有方法体。

抽象方法特点

  1. 一个抽象方法可以看作是一个虚函数
  2. 抽象方法的声明只能在抽象类中
  3. 抽象方法声明只提供一个无实现的方式,没有方法体
  4. 抽象方法体的实现被覆盖方法提供、覆写方法是一个非抽象方法的成员
  5. 抽象实现的行为和抽象方法相似
  6. 在一个静态属性中使用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 }
View Code
原文地址:https://www.cnblogs.com/liuzz/p/14521214.html