1,abstract
微软官网说明 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/abstract
abstract 修饰符可用于类、方法、属性、索引和事件(事件好像不行)。
抽象类不能实例化。
只有抽象类中才允许抽象方法声明。
在抽象方法声明中使用 static 或 virtual 修饰符是错误的。
无法使用 sealed 修饰符来修改抽象类,因为两个修饰符具有相反的含义。 sealed 修饰符阻止类被继承,而 abstract 修饰符要求类被继承。
抽象类可以继承接口,但必须实现接口方法(显示实现,隐式实现,抽象实现)。
interface IAction
{
void Fly();
void Swim();
}
public abstract class Bird : IAction
{
private int birdAge;
protected int birdType;
protected abstract int BirdAge//受保护重写,不能改变修饰符
{ set; get; }
protected abstract void Nest();//受保护重写,不能改变修饰符
public abstract void Eat();//公有重写,不能改变修饰符
public abstract void Swim();//抽象实现接口函数
public void Say()
{
Debug.Log("Bird Say ");
}
public void SetBirdAge(int birdAge)
{
this.birdAge = birdAge;
}
public void Fly()//隐式实现接口函数,接口与类都可以调用
{
Debug.Log("Bird Fly ");
}
void IAction.Fly()//默认为public,显示实现接口函数,接口可以调用,类不能调用
{
Debug.Log("IAction Fly ");
}
void IAction.Swim()//默认为public,显示实现接口函数,接口可以调用,类不能调用
{
Debug.Log("IAction Swim ");
}
}
public class Bird_YanZi : Bird
{
protected override int BirdAge
{
get{ return birdType; }
set{ birdType = value;}
}
protected override void Nest()
{
Debug.Log("Bird_YanZi Nest ");
}
public override void Eat()
{
Debug.Log("Bird_YanZi Eat ");
}
public override void Swim()
{
Debug.Log("Bird_YanZi Swim ");
}
public void DoSomething()
{
SetBirdAge(10);
}
}
2,interface
微软官网说明 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/interface
接口只包含方法、属性、索引器,事件(事件好像不可以)的签名。默认都为public,且不能使用限制访问修饰符。
一个接口可从一个或多个基接口继承。
实现接口的类可以显式实现该接口的成员。 显式实现的成员不能通过类实例访问,而只能通过接口实例访问。
基类型列表包含基类和接口时,基类必须是列表中的第 1 项(不知道是什么意思?不管了)。
interface IAnimAction
{
void Eat();
int Age{get;set;}
int this[int index] { get;set; }
}
interface IAnimSpecialAction : IAnimAction
{
void SpecialEat();
}
public class Anim : IAnimSpecialAction,IAnimAction
{......}
3,virtual
微软官网说明 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/virtual
virtual 关键字用于修改方法、属性、索引器或事件声明(事件好像不行),并使它们可以在派生类中被重写。
virtual 修饰符不能与 static,abstract,private 或 override 修饰符一起使用。
如果出现以下情况,Fruit是父类,Apple是子类。
比如:Fruit fruit(引用部分) = new Apple()对象部分;
一个引用部分,一个是对象部分,如果是virtual ,那就看对象部分的内容。否则就看引用部分的内容。
public class Fruit
{
int age;
int[] myType = new int[10];
public virtual void Eat() { }
public virtual int Age { get {return age; } set {age = value; } }
public virtual int this[int index] {get { return myType[index]; } set { myType[index] = value; } }
}