浅谈接口和抽象类

2018-10-15  本文已影响0人  三岁能抬头

概念引入

什么是接口?
接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。
注意:C#中不能包含任何静态成员。一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。
什么是抽象类?
抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象方法由overriding方法来实现。

相同与不同

相同点

不同点

典型例子

  1. 定义抽象类
public abstract class Animal
{
    //定义静态字段
    protected string _name;

    //定义属性
    public abstract string Name
    {
        get;
    }

    //定义方法
    public abstract void Show();

    public void MakeVoice()
    {
        Console.WriteLine("All animals can make voice!");
    }
}
  1. 定义接口
public interface IAction
{
    void Move();
}
  1. 实现抽象类和接口
public class Duck : Animal, IAction
{
    public Duck(string name)
    {
        _name = name;
    }

    //重载抽象方法
    public override void Show()
    {
        Console.WriteLine(_name + " is showing for you.");
    }

    //重载抽象属性
    public override string Name
    {
        get { return _name; }
    }

    //实现接口方法
    public void Move()
    {
        Console.WriteLine("Duck also can swim.");
    }
}
public class Dog : Animal, IAction
{
    public Dog(string name)
    {
        _name = name;
    }

    public override void Show()
    {
        Console.WriteLine(_name + " is showing for you.");
    }

    public override string Name
    {
        get { return _name; }
    }

    public void Move()
    {
        Console.WriteLine(_name + " also can run.");
    }
}
  1. 客户端实现
static void Main(string[] args)
{
    Animal duck = new Duck("Duck");
    duck.MakeVoice();
    duck.Show();

    Animal dog = new Dog("Dog");
    dog.MakeVoice();
    dog.Show();

    IAction dogAction = new Dog("A big dog");
    dogAction.Move();
}
  1. 结果
1. All animals can make voice!
2. Duck is showing for you.
3. All animals can make voice!
4. Dog is showing for you.
5. A big dog also can run.

总结规则与使用场合

本文转至: [你必须知道的.NET] 第二回:对抽象编程:接口和抽象类

上一篇下一篇

猜你喜欢

热点阅读