首先说一下最有必要说的一点也是在接口和抽象类间困扰大家的问题——接口和抽象类有什么区别,分别该用在哪个场景下?
这里就提炼的给大家说一下
抽象类和接口看似都差不多,其实作用和定义却有大不同。
首先抽象类是个类,也就说抽象类要遵守类的规则——继承规则——类于类的单继承,类只能继承一个类,但可以继承多个接口,且声明继承时,继承类的声明必须写在所有接口的前面。
抽象类中必须要有至少一个抽象成员;也可以有非抽象成员 它可以有构造函数和属性 接口则只能提供方法定义和属性的定义,且它不能设置它的修饰符。
当多个类包含相同的特征特性或结构时我们可以使用抽象类。
接口更多的是一种规范,所定义的所有方法和属性必须被子类或孙子类实现。
当我们定义多个类,这几个类中有共同的属性和行为方法时,我们可以把这共用的成员抽象出来,作为这几个类的基类。
如果希望这几个共有的成员,执行不同的操作,且不希望实例化抽象出来的基类。那么就可以使用抽象类定义基类,即使用abstract关键字声明Class并且abstract声明抽象类中方法(抽象类中可以有抽象方法也可以有实方法-》这里的实方法指的是非虚方法,abstract可以看做隐式的虚方法 ) 。之后通过继承于这个抽象类的派生类重写实现这个抽象方法。
(这里不相对的说哦,以三个类三层继承关系说明。基类 <-子类 <-孙子类)最基类(抽象类)抽象方法的实现也可以由孙子类实现,前提是继承于最基类的子类必须也是抽象类。
如果子类不是抽象类,又因为最基类(抽象类)中又有抽象方法,要想继承基类就必须实现基类中的抽象方法。所以在子类中就也得重写抽象方法了。
public abstract class Person
{
public abstract void beHavior();
}
//public class Student : Person
//{
// public override void beHavior()
// {
// throw new NotImplementedException();
// }
//}
public abstract class Student : Person
{
}
//经过测试孙子类要想实现抽象类就子类可以为抽象类
//如果子类不是抽象类, 就必须在子类重写实现基类(抽象类)的抽象方法
public class pupil:Student
{
public override void beHavior()
{
Console.WriteLine("测试 孙子类是否可以实现抽象类");
}
public void owner()
{
Console.WriteLine("子类自己的方法");
}
}
class Program
{
static void Main(string[] args)
{
Person person = new pupil();
person.beHavior();
Console.ReadLine();
}
}
那么就有问题了,override重写的哪个类的方法。当然重写了基类中的虚方法的功能。因为继承的关系是可以传递的。