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(接口)实现。