C#==抽象类和抽象函数(经典)
抽象类实质是对象的抽象,它只能⽤作基类,是对继承⼦类的对象的抽象;
⽽接⼝实质是继承的⼦类定义了⼀个必须完成的功能清单的定义统⼀接⼝规范强制功能清单约束。
两者都是不能被实例化的,只是⼀个定义,由继承的⼦类来完成,
abstract修饰符可以和类、⽅法、属性、索引器及事件⼀起使⽤,在类声明中使⽤abstract修饰符以表明这个类只能是其他类的基类。抽象类的特性
(1)抽象类不能被实例化
(2)抽象类可以包含抽象⽅法和抽象访问器
(3)不能⽤sealed修饰符修改抽象类,因为抽象类本⾝就是⽤来给其他类继承的
(4)抽象类的⾮抽象⼦类必须实现其继承的所有抽象⽅法和抽象访问器
抽象⽅法
(1)抽象⽅法是隐式的虚⽅法
(2)抽象⽅法只允许声明在抽象类中
(3)抽象⽅法不能提供实际的实现,所以没有⽅法体;抽象⽅法的实现是在⾮抽象的派⽣类中以override重写实现的
(4)抽象⽅法声明中不可以使⽤static或者virtual修饰符
(5)abstract关键字不能修饰静态⽅法或静态属性
抽象类的构造函数
(1)不要再抽象类中定义public或protected internal访问权限的构造函数
(2)应在抽象类中定义protected或private访问权限的构造函数
(3)如果在抽象类中定义⼀个protected构造函数,则在实例化派⽣类时,基类可以执⾏初始化任务
抽象⽅法和虚⽅法的区别
虚⽅法有实现部分,并且派⽣类对其重写是可选的;抽象⽅法没有实现部分,并且强制⾮抽象派⽣类对其重写
using System;
using System.Collections;
//抽象类
public abstract class Animal
{
protected string face;
//声明为protected的构造函数,在实例化派⽣类时,基类可以执⾏初始化⼯作
protected Animal() { this.face = "^_^"; /*抽象类构造函数初始化的例⼦*/}
public abstract void eat();
public abstract string Face
{
get;
}
}
public class dog : Animal
{
//重写基类中的抽象访问器Face
public override string Face
{
get
{
return face;
}
}
//重写基类中的抽象⽅法eat
public override void eat()
writeline函数{
Console.WriteLine("狗吃⾻头 " + Face);
}
}
public class cat : Animal
{
public override string Face
{
get
{
return face;
}
}
public override void eat()
{
Console.WriteLine("猫吃鱼 " + Face);
}
}
public class panda : Animal
{
public override string Face
{
get
{
return face;
}
}
public override void eat()
{
Console.WriteLine("熊猫吃⽵⼦ " + Face); }
}
public class MainFun
{
static void Main()
{
Animal[] anim = new Animal[3];
anim[0] = new dog();
anim[1] = new cat();
anim[2] = new panda();
anim[0].eat();
anim[1].eat();
anim[2].eat();
Console.ReadKey();
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论