.NET题

qq_35827033 2016-09-01 04:55:54
abstract class和interface有什么区别?
...全文
156 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
假设我们单独拎出一个接口
    public interface IMyException
    {
        Exception ex { get; set; }
        Datetime CreateTime{get;set;}
    }
它定义了“凡是实现了 MyException 的类都要有两个属性”,那么这个好还是不好呢?完全无法单独判断其好坏。如果我们定义为某种 class,那么就可以增加这两种属性的默认初始值,甚至在内部监听其属性改变而做一些动作,并且让子类继承这些行为。 一般来说,定义为接口,是因为我们可能遇到了“无奈的”情况,必须用于多重继承,也就是说有许多对象可能都需要“是一个 MyException”,但是这些对象每一种类都有一个更为重要的“父类”需要继承。万般无奈,我们不得不让每一种实现了 IMyException 的类型都手写去实现这两个属性、以及首先千篇一律的行为代码。因为 .net 并不支持多重继承。
  • 打赏
  • 举报
回复
在设计上,所有的 class、interface,我们都可以弱化地说成是”类型“。于是可以说,在设计上,实际上是天生地支持多重继承的。可以说,区分使用 interface还是 class,是一种“伎俩”,是在程序实现阶段去权衡考虑的,而不是在设计阶段。如果你没有面向领域的类型结构的预先设计,直接就动手写程序,那么你可能就一遍遍纠结编程语法了。实际上对于一个设计上发现的“类型”,你可以写class也可以写interface,也可以加上abstract,这些区别都是从编程实现角度考虑的(例如abstract class保证不被实例化,interface保证可以用于多重继承设计)。它们在分析和设计上都是同样的含义,都是类型。
  • 打赏
  • 举报
回复
interface 是最为“干巴巴”的东西了,它只有接口形式签名定义,没有任何实现。我们知道内涵最少的东西往往外延最大,所有有些人说它(interface)最万能。比如说你实现了一个“玩具”类,然后你实现一个“电动玩具”类,如果你可以继承原来写好的代码的话,那么是非常惬意的事情。但是如果你只是按照接口来说,那么你就得重写一整套“委派”代码,当大量遇到这种代码时会非常痛苦。 class 是可以继承代码的,因此用起来非常舒服。可惜.net 以及 java 都不支持多重继承,这是一个遗憾。 甚至直到10年前,还有些人写书说“多重继承很不好”。那么后来为什么又要用接口来实现多重继承、并且又要编程的人自己去用各种形式去实现呢?为什么不统一实现一种多重继承语法糖来规范呢? c# 还没有这个设计。因此凡是你看到 interface 的地方,你不但得写上“类型 : I类型" 这类接口实现语法,而且必须保证再手写写一堆代码来实现接口的每一个方法,必须手写一遍,无法省略(继承一个原始定义)。 简单说,假设 abstract class 是正确地表达需求设计的,那么你就没有必要再用 interface 表示同样的(但是没有任何代码可继承的)类型。反之,假设你发现某个子类已经是从其它父类继承了,那么就没有办法继承这个 abstract class 了,被逼无奈你只能退而使用比较痛苦的 interface 了。
王志威丶 2016-09-01
  • 打赏
  • 举报
回复
抽象类(abstract class)与接口(interface)的区别: 从表象上来说,抽象类可以给出一些成员的实现,接口却不包含成员的实现,抽象类的抽象成员可以被子类部分实现,接口的成员需要实现类完全实现,一个类只能继承一个抽象类,但可以实现多个接口等等。 第一,类是对象的抽象,抽象类是对类的抽象;接口是对行为的抽象。接口是对类的局部(行为)进行的抽象,而抽象类是对类整体(字段,属性,方法)的抽象。如果只关注行为抽象,那么也可以认为接口就是抽象类。总之,不论是接口,抽象类,类甚至对象,都是在不同层次,不同角度进行抽象的结果,它们的共性就是抽象。 第二,如果行为跨越不同类的对象,可使用接口;对于一些相似的类对象,用继承抽象类。 第三,从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本不知子类的存在,方法如何实现还不确认,预先定义。

13,347

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET技术前瞻
社区管理员
  • .NET技术前瞻社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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