您的位置:首页 > 其它

【基础】我对接口、抽象类及虚函数的理解

2015-02-13 22:40 246 查看

一、前面的话

对于C#中的接口、抽象类中的抽象方法以及虚方法的比较,网上有很多的例子,讲得也很到位,这篇博文的目的一方面是为了巩固自己的基础知识,另一方面是能够让初学者更加深刻、轻松地去理解和接受这三者之间的区别与联系。

二、接口与抽象类

首先说说接口和抽象类的区别与联系,接口是什么?接口是一组规则,它对应着自然界中“如果你是……则必须能……”的思想,如:猫猫是动物,动物可以吃食物、可以移动,也就是说某个类实现了某个接口,就必须实现该接口的规则(方法),如果接口中的方法(规则)太多,可以考虑接口分离,接口是可以继承的,当然这不是本篇文章的重点。既然接口是一组规则,那么它的作用就是约束其他实现了该接口的类,而自己本身不能实例化。既然接口是一组规则,那么这个规则是什么样呢?就是包含了一系列的方法,在具体一点就是没有修饰符和方法体的方法。好了,现在在重新理解“接口是一组规则”这句话,接口就是包含了一系列没有修饰符和方法体的方法的集合,这就是接口。结合代码看一下:

interface IAnimal
{
//public void run();
4         //The modifier 'public' is not valid for this item
void run();
void eat();
string speak();
}


接口中的方法不能有修饰符和方法体,如果加上修饰符就会报错(第4行)。而实现了该接口的类必须实现其中的run、eat、speak方法。此外,接口中不能有字段。

class Cat:IAnimal
{
#region IAnimal Members

public void run()
{
Console.WriteLine("run run!");
}

public void eat()
{
Console.WriteLine("delicious~");
}

public string speak()
{
return "miao~";
}

#endregion
}


Cat类实现了IAnimal接口,那么它必须实现IAnimal中的所有方法(规则)。

理解了接口,抽象类就比较简单了,与接口相同的是,抽象类的抽象方法不能有方法体,都是需要子类来实现具体的逻辑(如Cat中的eat方法)。但是,抽象类中可以有字段,抽象类其实就是一个特殊的普通类,只要有抽象方法,那么这个类就是抽象类。

abstract class AbstractCat
{
//field
private double weight;
//abstract method
public abstract void eat();
//normal method
public void run()
{
Console.WriteLine("run run!");
}
}

class BlackCat:AbstractCat
{
//Implement abstract method
public override void eat()
{
Console.WriteLine("delicious!");
}
}


三、抽象方法与虚方法

我们可以把抽象方法看成没有方法体的虚方法,二者都可以被子类重写,并以override关键字修饰。不同的是,虚方法必须有方法体。

abstract class AbstractCat
{
//field
private double weight;
//abstract method
public abstract void eat();
//normal method
public void run()
{
Console.WriteLine("run run!");
}
}

class BlackCat:AbstractCat
{
//Implement abstract method
public override void eat()
{
Console.WriteLine("delicious!");
}

public virtual string speak()
{
return "Miao!";
}

//public virtual void run();
}

class ChinaBlackCat : BlackCat
{
public override string speak()
{
return base.speak();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: