用接口和抽象类,与不用究竟究竟有什么区别或好处????晕。。。

wdmzjjjjjj 2005-09-02 11:25:54
学习
...全文
1038 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
zpingy 2005-12-30
  • 打赏
  • 举报
回复
我看大家都不要浮躁,问的人和答的人都一样,很多人的确是答非所问,或则回答没有耐心,回答不好就想好了再回答,不要骂人,学习讨论而已。
xujiaoxiang 2005-12-30
  • 打赏
  • 举报
回复
做一个图形绘制软件。包含Rectangle、Line、Ellipse等图形,实现Draw方法。有一个集合array容纳所有图形对象,绘制集合中的图形。

1、 在不定义接口和抽象类时
class Rectangle
{
void Draw()
{
//。。。。。。
}
}
class Line
{
void Draw()
{
//。。。。。。
}
}
class Ellipse
{
void Draw()
{
//。。。。。。
}
}
绘制时
for(int i=0;i<array.Count;i++)
{
if(array[i] is Rectangle)
{
(array[i] as Rectangle).Draw();
}
else if(array[i] is Line)
{
(array[i] as Line).Draw();
}
else if(array[i] is Ellipse)
{
(array[i] as Ellipse).Draw();
}
}

2、 定义接口和抽象类时
abstract class Shape
{
void Draw();
}
class Rectangle :Shape
{
void Draw()
{
//。。。。。。
}
}
class Line :Shape
{
void Draw()
{
//。。。。。。
}
}
class Ellipse :Shape
{
void Draw()
{
//。。。。。。
}
}
使用时:
for(int i=0;i<array.Count;i++)
{
(array[i] as Shape).Draw();
}

已经可以看到差别了。如果你要支持更多的图形和更多的功能,差别就明显了。

可能你会想不用抽象类也可以实现。可是你怎么实现Shape这个类的Draw方法。Shape本身就是个抽象的概念。你不会希望谁创建了一个Shape实例吧。

类似的如“动物”是个抽象类。有类别(哺乳类,两栖类等)等属性,有吼叫等方法。这些都需要一个抽象类来定义。

如果没有抽象类,你打算怎么来实现?

书上也有很多这样的例子。讲解的也很详细。(以上的例子也源于一本书,忘记书名了~)。
抽象和接口不仅限于此。需要在实践中不断总结。
xianbin 2005-12-08
  • 打赏
  • 举报
回复
hzw66(超越理想) 的回答已经不错了,楼主只要记下来,以后有点体会了再来看hzw66(超越理想)的话你就会知道那些话的意思了.

另外,浮躁的心态是很难学到好东西的.
bbdog 2005-12-07
  • 打赏
  • 举报
回复
泡泡兄关于数据库的那个举例真的太形像了,我得好好体会一下.
谢谢了.
hainang1234 2005-11-16
  • 打赏
  • 举报
回复
看看这个命名空间的接口用法吧:System.Collections。

抽象类就比较明显了,可以写实现嘛。而某些方法只应该有定义必须让派生类去实现,所以又只能写成抽象函数,于是就用抽象类。
cjnet 2005-11-16
  • 打赏
  • 举报
回复
我到是学了很多哦,呵呵
ybbigepl 2005-11-16
  • 打赏
  • 举报
回复
白ci,别人回答并帮助你,你怎么能这样说,比如你需要一个类不允许它实例化,你就可以声明为abstract ,然后通过对这个抽象类的继承使用,这样可以将一些多个类要要求用的属性或方法都放到该抽象类中,接口主要是解决多从继承的问题,增加了代码的灵活性。
xiao_p 2005-11-16
  • 打赏
  • 举报
回复
合理的运用接口,这就是软件开发的一个准则,大师就是这么说的
呵呵
你就当公理用吧
至于怎么证明
就要靠你的将来的经验的增加和知识的积累了………………
xiao_p 2005-11-16
  • 打赏
  • 举报
回复

当年看设计模式的时候 就看见大师说好的软件是面向借口的,不是面向实现的
但是就是不明白,后来思考的久了才知道

这不是几句话就能说明白的问题,而是关于整个oo的思考,简单的说就是为了增加复用性,减少维护的难度,增加灵活性

feihu_02 2005-11-16
  • 打赏
  • 举报
回复
studying
nibaijing 2005-09-03
  • 打赏
  • 举报
回复
我能理解搂主的心情,因为刚刚步入面向对象编程的同志都有过这种心情,我也是。我们学习新的知识的途径有很多,能通过有丰富编程和项目经验的人手把手的教那是最好的捷径,然而,冰冻三尺非一日之寒,我们需要的是通过前辈的指点,再加上自己的钻研,这才是最实在的途径。以上同志对楼主的回答,并非答非所问,只是说的简洁,自己多钻研,别无他法。
wdmzjjjjjj 2005-09-03
  • 打赏
  • 举报
回复
up
wdmzjjjjjj 2005-09-03
  • 打赏
  • 举报
回复
UP
自然框架 2005-09-03
  • 打赏
  • 举报
回复
你是来请教的吧!

难道你是来考我们的????

怎么会出来个“答非所问”呢?
yynice 2005-09-03
  • 打赏
  • 举报
回复
学习中。。。谢谢pupo(泡泡) 、LinFengCyl(林风) ,又学到了很多
不过楼主似乎还是不满意,呵呵
zhiri84 2005-09-03
  • 打赏
  • 举报
回复
关注
linfengcyl 2005-09-02
  • 打赏
  • 举报
回复
上面的兄弟说得不错了,你还这种态度?火气这么大干嘛?你干脆直接问为什么要OO比较好。用它们好处多了,主要是减少耦合以便于构建复杂的系统,具体的就自己看看书,多思考,多实践。这样大的题目不是这样问别人回答一两句你就能真正弄明白的。
wdmzjjjjjj 2005-09-02
  • 打赏
  • 举报
回复
真的没人能真正说明白?????????
wdmzjjjjjj 2005-09-02
  • 打赏
  • 举报
回复
答非所问,我问的是为什么要用接口或抽象类,不用他们一样能实现功能
hzw66 2005-09-02
  • 打赏
  • 举报
回复
接口和抽象类关系很紧密,它们都具有对成员的抽象。
对于一个抽象类,至少一个方法是抽象方法既可,这意味着它也可以具有具体方法[译注:Concrete Method,这只是相对于抽象方法而言,面向对象中并没有这个概念]。
对于一个接口,所有的方法必须都是抽象的。
实现了一个接口的类必须为接口中的所有方法提供具体的实现,否则只能声明为抽象类。
在C#中,多重继承(Multiple Inheritance)只能通过实现多个接口得到。抽象类只能单继承[注:C#中的单继承是指所有类作为基类的时候都只能是派生类声明中唯一的基类,而不仅仅是抽象类]。
接口定义的是一个契约,其中只能包含四种实体,即方法、属性、事件和索引器。因此接口不能包含常数(Constant)、域、操作符、构造器、析构器、静态构造器或类型[译注:指嵌套的类型]。
同时,一个接口还不能包含任何类型的静态成员。修饰符abstract、public、protected、internal、private、virtual、override都是不允许出现的,因为它们在这种环境中是没有意义的。
类中实现的接口成员必须具有公有的可访问性。
加载更多回复(26)

110,545

社区成员

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

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

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