日期:2014-05-17  浏览次数:20999 次

为什么要接口和抽象类
一直使用抽象类和接口,谁能说说为什么要用这些,用了到底在项目中有什么好处了?
回答的要深刻些啊!!

------解决方案--------------------
C# code

//好处就是class C调用的A或B的方法只与接口相关就好 

InterFace IA
{
 void doSomeThing();
}
public class A:IA
{
 public void doSomeThing();
}
public class B:IA
{
 public void doSomeThing();
}
public class C
{
 public void useAorB(IA ia)
 {
  ia.doSomeThing();
 }
}

------解决方案--------------------
小明在家跟妈妈说,我要吃水果
妈妈去水果摊去买水果,看看哪个便宜就买哪个。
最后买回去了橘子。
这就叫抽象类。


你在街上被人群殴,有人用棍子打你,有人用脚踹,有人用拳头。反正你费血了。
这就叫接口。
------解决方案--------------------
这样吧,你的电脑上只有一个USB接口。
这个USB接口可以接MP3,数码相机,摄像头,鼠标,键盘等。。。
好了,这里就有一个问题:所有的上述硬件都可以公用这个接口,而且有很好的扩展性。
这就是接口


你有一辆宝马的汽车,有一天,你拿它去越野了,轮胎,哎,自然爆掉,现在你想换轮胎。
你不想换宝马的轮胎,太贵。
你不想换qq的轮胎,不好使。
你想换OOOO的,换了,好用。
这就是抽象类。
------解决方案--------------------
我喜欢用接口最多的情况是在反复处理一类数据时,比如画图,可能画圆,画矩形...;
这是我定义一个图形接口,要画的图形从继承这个接口;

还有就是对一些经过好几层压缩的数据文件解析时,每层的解压都继承自同一个接口;

这样我在操作的时候可以采用一个递归的方法,不需要关心我现在处理什么,只有到实现具体操作的时候才判断要做什么,这样可以节省很多代码,而且结构也很简单
------解决方案--------------------
1、首先让理解接口和抽象类的使用环境
横看接口竖看类:横向扩展使用接口;纵向扩展使用抽象基类;横向和纵向都要扩展,使用抽象基类继承接口。
在差异较大的对象中追求功能上的共性时,使用接口。
在差异较小的对象中追求功能上的不同时,使用抽象基类,因为抽象基类可以包含实现的成员。

比如说,篮球场上有前锋(forward)、中锋(center)、后卫(guard),无论哪个位置,前锋、中锋和后卫都有防守和进攻的责任,另外中锋专注于篮板。这时候,可以定义运动员(player)抽象基类,抽象基类中定义虚(virtual)方法:Attack(进攻)、Defense(防守),然后让前锋类、中锋以及后卫类去重载(override)。
class Player
{
public virtual void Attack(){}
public virtual void Defense(){}
}
class Forward:Player
{
public override void Attack(){//前锋的进攻}
public override void Defense(){//前锋的防守}
}
class Center:Player
{
public override void Attack(){//前锋的进攻}
public override void Defense(){//前锋的防守}
public void Rebound(){//抢板}
}
class Guard:Player
{
public override void Attack(){//前锋的进攻}
public override void Defense(){//前锋的防守}
}
class PlayerInvoke:Player
{
private Player _player;
public PlayerInvoke(Player player)
{
_player=player;
}
public void Attack()
{
_player.Attack();
}
public void Defense()
{
_player.Defense();
}
}
调用的时候
Player player=new Forward();
Player player=new Center();
Player player=new Guard();
PlayerInvoke pi=new PlayerInvoke(player);
pi.Attack();
这是简单工厂实际模式的简单应用,此时你要查看哪个位置运动员的防守、进攻不是灵活多了?而且,在增加其它位置的运动员时,易于扩展和维护。
------解决方案--------------------
interface IUSB
{
void Connect();
void Close();
bool SendByteToDevice(long location,byte b);
byte GetByteFromDevice(long location);
}

class MP3:IUSB
{
void Connect()
{
MessageBox.Show("MP3 Connected");
}

void Close()
{
MessageBox.Show("MP3 Removed From USB Interface");
}
bool SendByteToDevice(long location,byte b)
{
return false;
}
byte GetByteFromDevice(long location)
{
return 0;
}
}


class Mouse:IUSB
{
void Connect()
{
MessageBox.Show("Mouse Connected");
}

void Close()
{
MessageBox.Show("Mouse Removed From USB Interface");
}
bool SendByteToDevice(long location,byte b)
{
return false;
}
byte GetByteFromDevice(long location)
{
return 0;
}
}



main(string[] fucks)
{
IUSB usb=new MP3();
usb.Connect();
usb.Close();

usb=new Mouse();