代码改变世界

12.C# 接口和抽象类的区别

2019-03-12 12:02  若藜520  阅读(1875)  评论(0编辑  收藏  举报

1.抽象类

声明方法的存在而不去实现它的类叫做抽象类,抽象类用abstract关键字声明。抽象类主要用来规定某些类的基本特征,继承它的子类必须实现抽象类的抽象成员,否则这个子类也为抽象类。

public abstract class Fruit
    {
        public string  vendor { get; set; } //默认为private
        
        public abstract float Price { get; } //抽象属性必须是公有的

        public abstract void GrowInArea(); //抽象方法必须是公有的
    }

抽象类的实现

public class Apple : Fruit
    {
        public override float Price
        {
            get
            {
                if (vendor == "红富士")
                    return 100;
                else
                    return 0;

            }
        }

        public override void GrowInArea()
        {
            Console.WriteLine("我在南方北方都能生长,我的生产商是:" + vendor + ",我现在的价格是:" + Price);
        }
    }

 子类继承抽象类,需要override抽象类中的抽象属性和抽象方法,如果有未override的,则子类也必须为抽象类

总结:

1、抽象类中的抽象属性和抽象方法必须是公有的,因此必须有public修饰符
2、子类必须override抽象类中的所有抽象属性和抽象方法,如果没有全部override,那么子类必须是抽象类
3、抽象类中可以有非抽象属性和非抽象方法,也可以是私有或者公有,但是如果是私有的话子类就不能访问,无意义,所以一般情况下都设置为公有
4、有抽象方法或抽象属性的类一定是抽象类,抽象类中的属性或方法不一定都是抽象的

参考https://www.cnblogs.com/adawoo/p/6434009.html

 

2.接口

接口类似抽象类,它是用来描述不同类之间一组相关行为的一种契约,主要用来表示不同类之间的共有特征

interface IHotDrink
    {
        //是否添加糖
        bool Milk { get; set; }
        //添加糖的块数
        int Sugar { get; set; }

        int AddSugar(int amount);
    }

    class CupOfCoffee : IHotDrink
    {
        //咖啡的品牌
        public string BeanType;

        bool _milk;
        bool IHotDrink.Milk
        {
            get
            {
                return _milk;
            }
            set
            {
                _milk = value;
            }
        }

        int _sugar;
        int IHotDrink.Sugar
        {
            get
            {
                return _sugar;
            }
            set
            {
                _sugar = value;
            }
        }

        int IHotDrink.AddSugar(int amount)
        {
            _sugar = amount;
            return _sugar;
        }
    }

3.接口的抽象类的相同点和区别

相同点:

1)接口和抽象类都不能实例化

2)接口和抽象类都可以被子类继承

3)子类必须实现接口和抽象类的抽象成员

区别:

1)抽象类只能继承自一个基类,接口可以继承自多个接口

2)抽象类可以包含字段、属性、方法,接口只能包含属性,方法,索引器,事件,不能包含字段,构造函数、析构函数和静态成员或常量

3)抽象类可以包含抽象方法和实例方法,接口只包含抽象方法,不能有方法实现。

4)抽象类抽象成员必须显式用public修饰,接口默认为public,且不用public修饰,接口方法不能用abstract或者virtual修饰