zoukankan      html  css  js  c++  java
  • 12.C# 接口和抽象类的区别

    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修饰

  • 相关阅读:
    ASP.Net Core一个项目中如何支持多种身份认证方式
    c#正则表达式
    Newtonsoft.Json笔记 -JsonPath
    DotLiquid-介绍
    ASP.NET Core-请求频率限制(AspNetCoreRateLimit)
    使用dotnet-gcdump 查找耗内存的大对象【转】
    使用dotnet-dump 查找 .net core占CPU100%的原因【转】
    ADO.NET
    .NET Core-IServiceCollection扩展一个Replace方法
    SafeList-线程安全的List(c#)
  • 原文地址:https://www.cnblogs.com/lidaying5/p/10515251.html
Copyright © 2011-2022 走看看