当父类中的方法不知道如何去实现的时候,可以考虑将父类写成抽象类,将方法写成抽象方法。抽象类和抽象方法的关系是一个抽象类下面包含一个或多个抽象方法。如何理解“父类中的方法不知道如何去实现”?比如现在让写出一个父类并提供一个“动物鸣叫”的方法,并让子类去继承这些类。表现在代码上就是:
第1步,父类代码:
class Animal
{
public void bark()
{
Console.WriteLine("叫");
}
}
第2步,子类代码:
class Dog : Animal
{
}
第3步,主函数代码调用方法:
class Program
{
static void Main(string[] args)
{
Dog dog1 = new Dog();
dog1.bark();
Console.ReadKey();
}
}
这样看似没有什么问题,如果要增加一个鸭子类,也只需要继承Animal类就可以调用“动物鸣叫”的方法。但这样做并不方便,如果每个子类要用不同的方式叫,比如狗的叫是“汪汪汪”,鸭子的叫是“嘎嘎嘎”,猫的叫是“喵喵喵”……可能这时候可以想到用虚方法来实现,将父类的方法用virtual标记为虚方法,子类继承父类之后,用override重写方法。但还有更方便的做法,那就是抽象类,既然我们只关注子类如何实现方法,那么父类就不需要写方法体了。抽象类的使用步骤:
第1步,将父类标记为抽象类,并提供抽象方法:
abstract class Animal
{
public abstract void bark();//标记为抽象方法,抽象方法不能有方法体
}
第2步,让子类重写父类的方法:
class Dog : Animal
{
public override void bark()//子类重写
{
Console.WriteLine("狗,Dog,叫");
}
}
第3步,主函数代码:
class Program
{
static void Main(string[] args)
{
Animal dog1 = new Dog();
dog1.bark();
Console.ReadKey();
}
}
这样就算再增加一个Cat类,只要让Cat类继承抽象类,就可以重写抽象类的方法。注意继承抽象类的子类在声明对象时,是:Animal dog1 = new Dog();,而不是Dog dog1 = new Dog();
抽象类是实现多态的三种方式之一。
================================
抽象类的注意事项:
1.抽象类只用于声明,不包含实现,可以看成是没有方法体的虚方法。
2.抽象类只能作为其他类的父类,抽象类不能直接被实例化。除此之外抽象类具有类的其他特性。
3.抽象类可以没有抽象属性和抽象方法,但是,一旦有了抽象方法,就必须把这个类声明为抽象类。
4.抽象类可以继承自其他抽象类,可以选择覆盖父类的抽象方法,如果不覆盖,则其的子类必须覆盖它们。
5.抽象类不能是密封类
================================
面试常考知识点,抽象类和接口的异同:
一、相同点
1.都可以被继承。
2.都不能被实例化。
3.都可以包含方法声明。
4.子类必须实现未实现的方法。
二、不同点
1.接口可以多继承,但抽象类不可以多继承。
2.接口只能定义方法的声明,不能定义方法的实现。抽象类既可以定义方法的声明,还可能提供实现。
3.抽象类可以定义字段、属性、包含有实现的方法。接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法。
================================