抽象类不能实例化的根本原因是什么?不应该是有抽象方法就不能实例化了

shou_ji_dang 2011-10-18 08:45:25
抽象类不能实例化是因为抽象类里有没有实现的方法,这个理由很牵强。抽象类不是必须有抽象方法,抽象方法则必须放在抽象类里。反编译发现抽象类默认无参构造函数是保护的,但设置成公有的还是无法实例化(抽象类里没有抽象方法),而且不能有抽象构造函数或抽象静态方法。为什么要这样设置?不能实例化还要默认保护的无参构造函数干什么?
...全文
1580 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2011-10-18
  • 打赏
  • 举报
回复
抽象说明是缺少细节的,是不完整的。
默认保护的无参构造函数,应该是给编译器调用的,为了在实现层面上与其它类没有差异,简化了设计。
静态继承,确实是个问题,比如我个人的应用经常会碰到这个问题。我认为是.net开发组在这个问题上偷懒造成的,可能他们认为你把静态改成动态不就行了,只是感觉不优雅。
  • 打赏
  • 举报
回复
从面向对象设计来讲,抽象类是从一堆有某种共性的具体子类中抽象出来的,它代表的是这一类事物,而非具体的某一个
就像人和LZ的关系一样
shou_ji_dang 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 findcaiyzh 的回复:]
实例化后调用了abstract函数怎么办。它没有实现。
[/Quote]
即使没有写抽象函数还是被阉割掉了可能存在的这种风险,C#把危险降到很低很低
idaydayup 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shou_ji_dang 的回复:]

引用 4 楼 gengchenhui 的回复:
我觉得是这样,举个例子:张三是个人,人是动物,这里面张三是对象,人是类,动物就是个抽象类,你怎么去实例化一个动物?让他长成什么样?
我是这样理解面向对象的,跟现实生活联系起来。

很有道理,这种东西不能用语法考虑。三大特征必须联系生活才行。就好比静态成员可以当成一个家庭的财产,会一辈辈传下去,除非晚辈们重新有了新财产(隐藏了老辈们的财产)。……
[/Quote]
好乱 呵呵,确实要结合实际来思考 很多东西跟现实结合起来思考就会发现是对的.否则就想不通
宝_爸 2011-10-18
  • 打赏
  • 举报
回复
实例化后调用了abstract函数怎么办。它没有实现。
shou_ji_dang 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gengchenhui 的回复:]
我觉得是这样,举个例子:张三是个人,人是动物,这里面张三是对象,人是类,动物就是个抽象类,你怎么去实例化一个动物?让他长成什么样?
我是这样理解面向对象的,跟现实生活联系起来。
[/Quote]
很有道理,这种东西不能用语法考虑。三大特征必须联系生活才行。就好比静态成员可以当成一个家庭的财产,会一辈辈传下去,除非晚辈们重新有了新财产(隐藏了老辈们的财产)。而非静态的就好比家庭成员的财产,只有家庭有这个成员才会有这份财产。不知道这么理解对不对?
gengchenhui 2011-10-18
  • 打赏
  • 举报
回复
我觉得是这样,举个例子:张三是个人,人是动物,这里面张三是对象,人是类,动物就是个抽象类,你怎么去实例化一个动物?让他长成什么样?
我是这样理解面向对象的,跟现实生活联系起来。
shou_ji_dang 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wanghui0380 的回复:]
晕,还真能追,可惜追错方向了

思想决定手段,而非手段决定思想

抽象类不能实例化,是因为微软想把做成这样。

而不是莫个程序员对构造函数写了保护,于是微软说这样挺好,以后就这样办了
[/Quote]
这个我也想过,我觉得C#把许多可能出错的功能阉割掉了,静态类不能继承静态类我觉得有时是可以的,但C#为了防止有实例类继承静态类,直接让静态类不能派生也不能继承了,让静态类完全独立出来,只继承于Object。我只是怕自己理解错了,想看看大神们的想法是否相同。
wanghui0380 2011-10-18
  • 打赏
  • 举报
回复
晕,还真能追,可惜追错方向了

思想决定手段,而非手段决定思想

抽象类不能实例化,是因为微软想把做成这样。

而不是莫个程序员对构造函数写了保护,于是微软说这样挺好,以后就这样办了
bdmh 2011-10-18
  • 打赏
  • 举报
回复
理解为规定即可,当你主宰编译器后,你可以决定是否让实例化
shou_ji_dang 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sbwwkmyd 的回复:]
抽象说明是缺少细节的,是不完整的。
默认保护的无参构造函数,应该是给编译器调用的,为了在实现层面上与其它类没有差异,简化了设计。
静态继承,确实是个问题,比如我个人的应用经常会碰到这个问题。我认为是.net开发组在这个问题上偷懒造成的,可能他们认为你把静态改成动态不就行了,只是感觉不优雅。
[/Quote]
确实是这个问题,他们只是想减少麻烦,把整个静态类全部孤立起来,避免了讨论静态类继承实例类或者实例类继承静态类的麻烦,o(︶︿︶)o 唉,阉掉了

111,096

社区成员

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

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

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