1、抽象类
在类的继承中,如果一个个新的子类被定义,子类变得越来越具体,父类变得更加一般和通用,类的设计应该保证父子类能够共享特征,有时将父类设计得非常抽象,使得父类没有具体的实现,这样的类叫做抽象类;一般当我们设计一个类,不需要创建此类的实例时,可以考虑将该类设置成抽象类,让其子类实现这个类的抽象方法。C#允许把类、属性和函数声明为abstract
。抽象类不能实例化,抽象类可以包含普通属性和抽象属性,普通函数和抽象函数。抽象函数就是只有函数定义没有函数体的函数。显然,抽象函数本身也是虚拟(virtual
)的。
例如,
// 鸟的抽象类 abstract class Bird // 含有抽象属性和方法,就一定是抽象类 { // 鸟速度的属性 public double Speed { get; set; } // 鸟体重的属性 public abstract double Weight { get; set; } // 鸟飞翔的抽象方法 public abstract void Fly(); }
2、抽象属性
抽象类可拥有抽象属性,这些属性应在派生类中被实现。例如,
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace cjavapy {//定义一个person抽象类 abstract class Person {//定义抽象属性 public abstract string Name {//读写 get; set; } public abstract uint Age {//只读 get; } } //定义派生类 class Student : Person { private string name; private uint age=10; //实现抽象属性 public override string Name { get { return name ; } set { name=value; } } public override uint Age { get { return age; } } } class Program { static void Main(string[] args) { Student stu = new Student(); stu.Name = "cjavapy"; Console.WriteLine("{0} {1} ",stu.Name,stu.Age); //读属性 } } }
3、抽象方法
只有抽象类可以有抽象方法,不过抽象类可以有具体方法。如果把一个抽象方法放在一个类中,就必须标识这个类为抽象类。例如,
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace cjavapy {//定义一个person抽象类 abstract class Person { //定义抽象属性 public abstract string Name {//读写 get; set; } public abstract uint Age {//只读 get; } public abstract void Say(); } //定义派生类 class Student : Person { private string name; private uint age = 10; //实现抽象属性 public override string Name { get { return name; } set { name = value; } } public override uint Age { get { return age; } } public override void Say() { Console.WriteLine(this.Name+" is very good!!!"); } } class Program { static void Main(string[] args) { Student stu = new Student(); stu.Name = "cjavapy"; stu.Say(); } } }
使用抽象类和抽象方法使用接口和实现分离,更好地降低代码之间的耦合程序,更方便配合及团队开发也更加地规范。
注意:抽象也可以通过Interface(接口)实现。