抽象(abstract)和接口(interface)

抽象(abstract)

abstract是C#关键字,用于修饰类和方法,被abstract修饰的类和方法被叫做抽象类和抽象方法。

抽象类

特点

  • 不能被实例化。
  • 继承抽象类必须重写所有抽象方法。
  • 可以包含抽象方法。

语法格式

abstract class Thing	//abstract class 类名
{
	//成员变量
  //成员函数
  //其他
}

抽象方法

特点

  • 只能写在抽象类中。
  • 只能定义,没有方法体。
  • 继承类需要使用override重写。

语法格式

public abstract void Speak(); //访问修饰符 abstract 返回值类型 方法名(参数列表);

用法

//定义抽象类
abstract class Human
{
	public string name;
  public int age;
  public bool boy;

  public abstract void Speak(string name);
}

//继承抽象类
class Chinese:Human
{
	//重写抽象方法
	public override void Speak(string name)
  {
    Console.WriteLine("我的名字是{0}",name);
  }
}

static void Main(string[],args)
{
	Chinese person1 = new Chinese();
  person1.name = "李白";
  person1.Speak(person1.name);//输出 我的名字是李白
}

作用

定义类的规范。

接口(interface)

特点

  • 接口不能被实例化,但遵循里氏替换原则,可以作为引用。
  • 接口不可继承类,但可以继承其它接口,接口继承接口不需要实现,需要在继承接口的类中实现。
  • 接口中不包含成员变量,只包含方法,属性,索引器,事件。
  • 接口中的成员只声明不实现。
  • 继承接口的类必须实现类中的所有成员。
  • 接口命名通常首字母为I。
  • 类中可以定义接口(内部接口),定义了内部接口的类不可实例化。外部的类可以通过 类名.接口名继承该接口。
  • 接口中的成员默认是public,且一般都是声明为public

语法格式

interface IFly //interface 接口名
{
	public void Fly(); //定义成员函数,不能实现,默认是public

  string Name	//成员属性
  {
    get;
    set;
  }

  int this[int index] //索引器
  {
    get;
    set;
  }

  event Action doSomething; //事件
}

使用

interface IFly
{
	public void Fly();
}

interface IEat
{
	public void Eat();
}

//创建一个类继承接口IFly,接口IEat
class Animal
{
	public void Fly()	//实现IFly接口中的public方法
  {
    Console.WriteLine("我能飞");
  }

  public virtual void Eat()	//实现接口IEat中的public方法,并且设置为虚函数,可在子类中重写
  {
    Console.WriteLine("我能吃");
  }
}

//创建一个类继承类Animal
class Bird:Animal
{
	public override void Eat()
  {
  	base
    Console.WriteLine("我能吃");
  }
}

显式实现接口

当类继承一个接口中含有pretect类型成员(几乎不存在这种情况),或者继承两个接口中有同名成员,需要去显式实现这些方法。接口作为引用。

interface IWalk
{
	public void Move();
}

interface IRun
{
	public void Move(float speed);
}

class Animal:IWalk,IRun
{
	public void IWalk.Move()
  {
    Console.WriteLine("走动");
  }

  public void IRun.Move(float speed)
  {
    Console.WriteLine("跑动,以{0}速度",speed);
  }
}

static void Main(string[],args)
{
	Animal ani = new Animal();
  //ani中没有Move方法,需要转换成IWalk,IRun才可调用对用的方法
  //接口IWalk作为引用
  (ani as IWalk).Move()//输出 走动
  
  //接口IRun作为引用
  IRun ani2 = new Animal();
  ani2.Move(10.0)//输出 跑动,以10.0速度
}

作用

  • 定义方法的规则,通常用来定义某一种功能使用。
  • 用于多重继承。(C#类不能多重继承)。

抽象类和接口的区别

抽象类和接口都是用于对编程定义一种规范,它们本身是不能被实例化,需要被其他的类继承并且实现它门所定义的方法。
两者看起来很相似,它们也有些区别
抽象类是类,需要遵守类的规则。可以继承其他类,可以被其他类继承,不能多重继承(同时继承多个类)。接口则可以实现多重继承(类可以多重继承接口,接口可以多重继承其他接口,但接口不能继承类,类也不能多重继承其他类)。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值