为什么要接口和抽象类

num23679 2009-12-24 01:30:56
一直使用抽象类和接口,谁能说说为什么要用这些,用了到底在项目中有什么好处了?
回答的要深刻些啊!!
...全文
501 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyongjieailiting 2012-10-15
  • 打赏
  • 举报
回复
楼主解决没?我也很想知道,希望分享

  • 打赏
  • 举报
回复
抽象和接口的目的是为了解耦,让一大块变成一个一个的小块
解耦的目的是为了修改一处不影响另一处或整体(比如修改此一处要必须修改其它地方十余处,所谓的可维护)
如果把其中的一小块拿到其它地方也许也可以使用呢(所谓的可重用)
如果要添加新的功能,实现这个接口或者继承这个抽象类弄出一小块来插进去就可以用(所谓的可扩展),为什么一插进去就可以用呢?因为这些小块都有共同的抽象类或者接口,在调用方看来,这些小块是一样一样的
tangtingn 2009-12-24
  • 打赏
  • 举报
回复
不顶不行吖。。关注
wanghui0380 2009-12-24
  • 打赏
  • 举报
回复
我们简单还原一下 一价元素氢的实现

  接口 酸碱性接口
{
string 酸碱性
}

抽象类 一价元素:酸碱性接口 //抽象类继承酸碱性接口,以实现一价元素通用特性
{
string 酸碱性 {return “弱酸”}
}

元素类 氢:一价元素,酸碱性接口 //继承一价元素和酸碱性接口,并显示实现酸碱性接口,以实现氢元素独立的酸碱特性
{

string 酸碱性接口.酸碱性{return "氢的ph值是xxxx"}
}
guangmingdeshenju 2009-12-24
  • 打赏
  • 举报
回复
可以说是代码的重用,许多对象具备一些相同的功能,不可能
给每个类再分别定义一次这些函数嘛?
那太麻烦了啊!
所以有借口,抽象类,作为共享资源!
wanghui0380 2009-12-24
  • 打赏
  • 举报
回复
东西是老外整的,所以我们用老外的脑袋去看就成

回想一下高中化学,那个元素周期律

一价氢氯钾钠银 他们是一个家族的,所以他们被放到了“一价”元素这个抽象类里面,这就是抽象类的作用

然后我们在看他们的特性和规则。

酸性、碱性、可燃性、氧化性、还原性、热稳定性等 这些是规则和特性,所以这些东西我们则使用接口去限定他们
angel6709 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 angel6709 的回复:]
关于重用:
                LunTai dai = new BaoMaLuntai();
            Console.WriteLine(dai.size);
    public abstract class LunTai
    {
      public int size = 50;
    }

    public class BaoMaLuntai:LunTai//wang le
    {

    }

    public class OOOOLuntai:LunTai
    {

    }
[/Quote]
Li_anl 2009-12-24
  • 打赏
  • 举报
回复
这个一直搞不懂。。。
angel6709 2009-12-24
  • 打赏
  • 举报
回复
关于重用:
LunTai dai = new BaoMaLuntai();
Console.WriteLine(dai.size);
public abstract class LunTai
{
public int size = 50;
}

public class BaoMaLuntai
{

}

public class OOOOLuntai
{

}
wanghui0380 2009-12-24
  • 打赏
  • 举报
回复
这个说来话长了。得从c++那辈子说起了。

话说c++程序员是没有这两个关键字的,所有的多态都是virtual,但是情况一多一复杂就很难办了,c++程序员不得不在自己的代码里玩“意大利面条”,纯虚函数,base.base.method(),这样使代码非常难读难调试

所以后面的java和c#才特意规定了 这两个关键字,他就是一种限定,能让程序员更清楚的限定自己的代码

上面是语法的历史。

如果说实际意义,我们就的说哲学了。 按老外们的头脑认为,程序实际就是现实对象在头脑中的反映,是抽象的,形而上学的。抽象的东西是基石,就像原子和分子,老外说物质是原子和分子组的,所以他们更倾向于构建原子和分子 及规则。

相比来说 抽象类 就是 物质对象在头脑中的那个 物理或化学模型

而接口则通常是物质或化学模型里的 规则体现。

比如化学:苯环系列的东西在物质上可以被抽象成,苯环的抽象类。而苯环系列物质所体现的物理或化学特性则可以被当做接口规则去体现
zhujiazhi 2009-12-24
  • 打赏
  • 举报
回复
看看设计模式就知道为啥要的
num23679 2009-12-24
  • 打赏
  • 举报
回复
现在我这样理解了:
想了下,不管是接口还是抽象类,多态只是他的一个表现,不是目的。
1、接口
搭建框架的时候,层之间调用我用接口去实现(解耦)。也像书面说的“约定”
如12楼说“接口只是对某一类事物行为的规范”。意思这层的某个类只可以调用上一层哪些方法或属性,因为我调用的是一个接口,接口只告诉我可以使用哪些方法。

提供外部调用的时候,我提供一个接口,可以保护的作用,保护一些其他方法或者属性不被调用。

2、抽象类
子类继承它,就必须实现它的抽象方法。我们把共同的属性或者方法,写到一个抽象类里面,这样,我们再写一个类的时候,我就发现不需要重新写这个,看看他属于哪一个类型,直接继承这个类型。
因为只能继承一个类,所以要用接口,可以实现多个接口的继承。

有个不理解的地方,在代码的重用方面的。
抽象类里面的抽象方法还是接口里面的方法,都没有任何的实现的。我到底重用了什么?
18楼说:“这样我在操作的时候可以采用一个递归的方法,不需要关心我现在处理什么,只有到实现具体操作的时候才判断要做什么,这样可以节省很多代码,而且结构也很简单”
我想这个我们只是提供了一个方法让我们重写。并不存在重用了。。。

是不是感觉这样定义接口或者是抽象类,在重写方面,感觉还不如继承一个普通的类,可以调用父类的方法,我也可以重写它的。。?

现在感觉还是停留在,3楼那个理解。
江南小鱼 2009-12-24
  • 打赏
  • 举报
回复
3、接口:面向接口编程模式、适配器模式等
接口表示调用者和设计者的一种约定,在多人合作开发同一个项目时,事先定义好相互调用的接口可以大大提高开发的效率。接口是用类来实现的,实现接口的类必须严格按照接口的声明来实现接口提供的所有功能。有了接口,就可以在不影响现有接口声明的情况下,修改接口的内部实现,从而使兼容性问题最小化。

当其他设计者调用了接口后,就不能再随意更改接口的定义,否则项目开发者事先的约定就失去了意义。但是可以在类中修改相应的代码,完成需要改动的内容。

抽象类

抽象类是指这个类是不完全可用的,只能作为其它类的基类。抽象类和其它非抽象类的最大区别之处在于:抽象类不能被实例化。

1) 抽象类和接口都不能被实例化

2)接口是完全抽象的成员集合;抽象类可以完全实现,也可以部分实现或者根本不实现,从而封装继承类的通用功能

3) 抽象类只能作为基类使用,接口可以从其它基接口继承

4)接口成员默认访问方式是public,接口成员定义不能包含任何访问修饰符;抽象类则不然

5) 接口中不能声明任何种类的静态成员,抽象类则可以

6) 接口成员必须只能是方法、属性、索引器和事件,且不提供实现;抽象类还可以声明字段以及实现的方法和属性等

7) 抽象方法只能在抽象类中声明


wxd024 2009-12-24
  • 打赏
  • 举报
回复
帮顶,学习
江南小鱼 2009-12-24
  • 打赏
  • 举报
回复
2、抽象基类:实现代码复用
人分男人和女人,不论男人女人都有吃饭(这就是共性,当然还有很多其它共性),但是男人和女人有其它行为是不一样的(比如上厕所的方式,^_^低俗)..这时候可以把男人和女人的共性拿出来,然后使用集成,这样男人女人类都复用这些代码。
abstract class Person
{
public void Eating()
{//人吃饭}
public virtual void WC()
{
//男人和女人类重写
}
}
class Female:Person
{
public override void WC(){}
}
class Male:Person
{
public override void WC(){}
}
angel6709 2009-12-24
  • 打赏
  • 举报
回复
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();
usb.Connect();
usb.Close();
}


上面的就是接口。

接口主要用于多态化方法。




class BaoMaCar
{
AbLunTai LunTai= new BaoMaLunTai();
void runLongTime(){}
}

abstract class AbLunTai
{
string Name="AbLunTai";
}


class BaoMaLunTai
{

string Name="BaoMaLunTai";
}

class OOOOLunTai
{

string Name="OOOOLunTai";
}

main(string[] gays )
{
BaoMaCar car=new BaoMaCar();
car.runLongTime();
car.LunTai=new OOOOLunTai();
}

这就是抽象类,多用于多态对象。

flyerwing 2009-12-24
  • 打赏
  • 举报
回复
因为他想偷懒所以想概述下
江南小鱼 2009-12-24
  • 打赏
  • 举报
回复
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();
这是简单工厂实际模式的简单应用,此时你要查看哪个位置运动员的防守、进攻不是灵活多了?而且,在增加其它位置的运动员时,易于扩展和维护。
nashina 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 zi__qi 的回复:]
接口可以有属性。接口和抽象类是不同的。接口注重纯粹的抽象,而抽象类除注重抽象之外,还注重代码的复用。
[/Quote]

up
庄生晓 2009-12-24
  • 打赏
  • 举报
回复
接口可以有属性。接口和抽象类是不同的。接口注重纯粹的抽象,而抽象类除注重抽象之外,还注重代码的复用。
加载更多回复(19)

111,121

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧