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

时间:2021-10-31 16:48:18

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 ;
else
return ; }
} 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修饰