C# 类继承接口,到底类能“继承”到什么?

boot_black 2018-05-09 04:44:17
如题,这2天在看C#,对接口这个概念感觉是很理解。
请问,如果一个类继承了一个接口,这个类到底能从这个接口中”继承“到什么呢?
由于是新手,还请各位大神尽量说的通俗易懂一点,不慎感激!
...全文
1524 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
boot_black 2018-05-12
  • 打赏
  • 举报
回复
引用 31 楼 xuzuning 的回复:
类不能多继承只是个人为的约定,C++ 的类就是可以多继承的。 Java 从 C++ 分立出来时,规定了类不能多继承,但实践证明仅单继承是远远不能满足需要的,于是就引入了接口的概念(implements) C# 为了吸引 java 程序员加盟,才采取了 Java 的语法描述形式,自然的也就不支持多继承了 但 C# 有意混淆了 类和接口的区别,把接口当作类进行处理 从这个意义上说,类从 接口 继承到的是方法名。虽然一般说是实现了某个接口的方法,但这并无本质的区别 传统的类是通过继承、重写来实现多态性的 引入接口后,又多了一种实现多态性的手段 形式只收手段,功能才是目的
感谢大神指导! 标注:形式只收手段,功能才是目的
xuzuning 2018-05-12
  • 打赏
  • 举报
回复
类不能多继承只是个人为的约定,C++ 的类就是可以多继承的。 Java 从 C++ 分立出来时,规定了类不能多继承,但实践证明仅单继承是远远不能满足需要的,于是就引入了接口的概念(implements) C# 为了吸引 java 程序员加盟,才采取了 Java 的语法描述形式,自然的也就不支持多继承了 但 C# 有意混淆了 类和接口的区别,把接口当作类进行处理 从这个意义上说,类从 接口 继承到的是方法名。虽然一般说是实现了某个接口的方法,但这并无本质的区别 传统的类是通过继承、重写来实现多态性的 引入接口后,又多了一种实现多态性的手段 形式只收手段,功能才是目的
  • 打赏
  • 举报
回复
也可以定义 abstract 关键字的 --> 也可以使用 abstract 关键字来定义特性的 从强调设计的角度,就是说这里的 A 类型是继承了那些实现了 C、Container、Scraw 各类接口的对象的与外界通讯的规范,这就好像是主板上的插槽都是通用接口可以插上各种各样功能的外设扩展卡一样。这个“继承”就是说的是继承了接口定义文档。 与那种毫无接口概念的类型设计相比,这种 A 设计继承了 B、C、Container、Scraw 的设计文档里边的一大堆描述规格。所以从设计角度看其继承的含义,就不局限于底层的编程语言。
  • 打赏
  • 举报
回复
class 中也可以定义 abstract 关键字的,class 也是可以不提供代码而只是定义空壳的对外规范(实现时必须手写代码)。 把
class A : B, IC, IContainer, IScraw
{
    ......
}
这类代码说成是 A 继承 C、Container、Scraw,这在设计上是完全可以理解的。就好像一杯子里倒了半杯水,你可以说他是半满的也可以说他是半空的,我们这里强调设计理解更好。
大鱼> 2018-05-11
  • 打赏
  • 举报
回复
接口是对某些行为做一个约束,类你所理解的“继承”是对接口按照相对应的约束进行实现。
exception92 2018-05-11
  • 打赏
  • 举报
回复
其实C#中接口的出现是为了弥补类不能进行多继承其它类的缺陷。 一个类不能进行多继承自多个类,这个时候接口的出现就可以实现多继承,继承一方面提高了代码的复用性,一方面让派生类拥有一组执行规范,接口正是提供多种规范的最好方式。当然 抽象类也可以提供,但它不支持被多继承。
夜色镇歌 2018-05-11
  • 打赏
  • 举报
回复
"继承"的是规范,说继承有点不太合适,因为是实现接口。
exception92 2018-05-11
  • 打赏
  • 举报
回复
派生类继承自父类并重写父类中的抽象或者虚方法,或者显示、隐式实现接口中的方法(不能包括方法体),进而产生了面向对象的”多态“特性,正是由于继承,派生类才能表现出各自不同的状态。继承的并不单单的是方法,也可以是属性,事件等等。
xuzuning 2018-05-11
  • 打赏
  • 举报
回复
既然通过继承类,或者通过接口方式都可以调用类的指定方法,那两者有什么区别呢? 1、就方法而言,没有本质的区别 2、继承是纵向的,接口是横向的。是一个问题的两种表述方式 3、类的方法可能会因遗传代数产生变异,而接口方法不会 4、接口实际是类与类间沟通的桥梁
正怒月神 2018-05-11
  • 打赏
  • 举报
回复
引用 17 楼 boot_black 的回复:
[quote=引用 16 楼 sp1234 的回复:] 首先,面向类型编程设计,这是一个非常必要、非常强大的功能。有的人喜欢“万能地”什么字符串来代表一切,且不管其性能问题,就是这个不靠谱的特性对于工程化、正规化的项目也是很危险的。比如说微信团队写了代码
public void 问候( Person a, Message msg)
{
......
}
那么他们一定希望自己的几十万行代码中,编译器能帮他判断调用这个“问候”的代码哪些是不合法的代码。那么Person可能有几百种,只要具有Person父类或者接口就可以。对于Message 也是一样。 因此有了面向类型编程的概念,才能谈多态,然后继承才跟领域知识对应起来。 继承是面向对象的概念。如果从c#之类的编程语言的术语来说,可以说“实现”接口。但是从设计上说,其实可以把接口跟普通的可继承类统一起来看,这样许多支持多重继承而并不支持接口的编程语言(例如Effiel语言就是一种比c#、smalltalk还要经典地面向对象的语言)就统一起来了。 所以不用抠“继承”这个字眼儿。一旦学过一些面向对象的软件工程,或者例如学过一点 UML 之类的,就熟悉了。
认真看了大神的回复,非常感谢! 既然通过继承类,或者通过接口方式都可以调用类的指定方法,那两者有什么区别呢? 使用继承的方式让子类继承父类的方法,这个很容易理解。 那为什么需要“多此一举”增加一个接口呢? 是为了屏蔽父类中的其它方法(接口中未使用的方法)? 是为了开启解决某个指定问题的绿色通道(该接口“通道”只能专门解决某个指定问题)?[/quote] 这个很好理解, 鸟是一个抽象类,假设有老鹰,企鹅,两个派生类。 那企鹅肯定要实现一个 游泳的接口。 但是鸟和老鹰,都不可能有这个接口。
boot_black 2018-05-11
  • 打赏
  • 举报
回复
引用 16 楼 sp1234 的回复:
首先,面向类型编程设计,这是一个非常必要、非常强大的功能。有的人喜欢“万能地”什么字符串来代表一切,且不管其性能问题,就是这个不靠谱的特性对于工程化、正规化的项目也是很危险的。比如说微信团队写了代码
public void 问候( Person a, Message msg)
{
......
}
那么他们一定希望自己的几十万行代码中,编译器能帮他判断调用这个“问候”的代码哪些是不合法的代码。那么Person可能有几百种,只要具有Person父类或者接口就可以。对于Message 也是一样。 因此有了面向类型编程的概念,才能谈多态,然后继承才跟领域知识对应起来。 继承是面向对象的概念。如果从c#之类的编程语言的术语来说,可以说“实现”接口。但是从设计上说,其实可以把接口跟普通的可继承类统一起来看,这样许多支持多重继承而并不支持接口的编程语言(例如Effiel语言就是一种比c#、smalltalk还要经典地面向对象的语言)就统一起来了。 所以不用抠“继承”这个字眼儿。一旦学过一些面向对象的软件工程,或者例如学过一点 UML 之类的,就熟悉了。
认真看了大神的回复,非常感谢! 既然通过继承类,或者通过接口方式都可以调用类的指定方法,那两者有什么区别呢? 使用继承的方式让子类继承父类的方法,这个很容易理解。 那为什么需要“多此一举”增加一个接口呢? 是为了屏蔽父类中的其它方法(接口中未使用的方法)? 是为了开启解决某个指定问题的绿色通道(该接口“通道”只能专门解决某个指定问题)?
token不能为空 2018-05-11
  • 打赏
  • 举报
回复
接口是用来实现的,一个实现了特定接口的类就具有了接口对应的功能
zhuzhenhua_vip 2018-05-11
  • 打赏
  • 举报
回复
接口是用来做约束的,而不是为了让其他类去继承他的什么。其实Ipeople的例子很能表达接口的意思,定义一个接口IPeople,不管是黑人、白人、黄种人,只要继承了IPeople,他就要拥有IPeople是所有的功能。然后就可以面向接口编程了。这才是用接口的核心。
boot_black 2018-05-11
  • 打赏
  • 举报
回复
引用 21 楼 duanzi_peng 的回复:
其实C#中接口的出现是为了弥补类不能进行多继承其它类的缺陷。 一个类不能进行多继承自多个类,这个时候接口的出现就可以实现多继承,继承一方面提高了代码的复用性,一方面让派生类拥有一组执行规范,接口正是提供多种规范的最好方式。当然 抽象类也可以提供,但它不支持被多继承。
感谢大神无私指教!
boot_black 2018-05-11
  • 打赏
  • 举报
回复
引用 19 楼 xuzuning 的回复:
既然通过继承类,或者通过接口方式都可以调用类的指定方法,那两者有什么区别呢? 1、就方法而言,没有本质的区别 2、继承是纵向的,接口是横向的。是一个问题的两种表述方式 3、类的方法可能会因遗传代数产生变异,而接口方法不会 4、接口实际是类与类间沟通的桥梁
版主的解释让我有点茅塞顿开的感觉,非常感谢!
boot_black 2018-05-11
  • 打赏
  • 举报
回复
引用 18 楼 hanjun0612 的回复:
[quote=引用 17 楼 boot_black 的回复:] [quote=引用 16 楼 sp1234 的回复:] 首先,面向类型编程设计,这是一个非常必要、非常强大的功能。有的人喜欢“万能地”什么字符串来代表一切,且不管其性能问题,就是这个不靠谱的特性对于工程化、正规化的项目也是很危险的。比如说微信团队写了代码
public void 问候( Person a, Message msg)
{
......
}
那么他们一定希望自己的几十万行代码中,编译器能帮他判断调用这个“问候”的代码哪些是不合法的代码。那么Person可能有几百种,只要具有Person父类或者接口就可以。对于Message 也是一样。 因此有了面向类型编程的概念,才能谈多态,然后继承才跟领域知识对应起来。 继承是面向对象的概念。如果从c#之类的编程语言的术语来说,可以说“实现”接口。但是从设计上说,其实可以把接口跟普通的可继承类统一起来看,这样许多支持多重继承而并不支持接口的编程语言(例如Effiel语言就是一种比c#、smalltalk还要经典地面向对象的语言)就统一起来了。 所以不用抠“继承”这个字眼儿。一旦学过一些面向对象的软件工程,或者例如学过一点 UML 之类的,就熟悉了。
认真看了大神的回复,非常感谢! 既然通过继承类,或者通过接口方式都可以调用类的指定方法,那两者有什么区别呢? 使用继承的方式让子类继承父类的方法,这个很容易理解。 那为什么需要“多此一举”增加一个接口呢? 是为了屏蔽父类中的其它方法(接口中未使用的方法)? 是为了开启解决某个指定问题的绿色通道(该接口“通道”只能专门解决某个指定问题)?[/quote] 这个很好理解, 鸟是一个抽象类,假设有老鹰,企鹅,两个派生类。 那企鹅肯定要实现一个 游泳的接口。 但是鸟和老鹰,都不可能有这个接口。[/quote] 说的很透彻,感谢大神指教!
boot_black 2018-05-10
  • 打赏
  • 举报
回复
引用 9 楼 stevenjin 的回复:
接口为解耦为生
感谢指教
  • 打赏
  • 举报
回复
首先,面向类型编程设计,这是一个非常必要、非常强大的功能。有的人喜欢“万能地”什么字符串来代表一切,且不管其性能问题,就是这个不靠谱的特性对于工程化、正规化的项目也是很危险的。比如说微信团队写了代码
public void 问候( Person a, Message msg)
{
......
}
那么他们一定希望自己的几十万行代码中,编译器能帮他判断调用这个“问候”的代码哪些是不合法的代码。那么Person可能有几百种,只要具有Person父类或者接口就可以。对于Message 也是一样。 因此有了面向类型编程的概念,才能谈多态,然后继承才跟领域知识对应起来。 继承是面向对象的概念。如果从c#之类的编程语言的术语来说,可以说“实现”接口。但是从设计上说,其实可以把接口跟普通的可继承类统一起来看,这样许多支持多重继承而并不支持接口的编程语言(例如Effiel语言就是一种比c#、smalltalk还要经典地面向对象的语言)就统一起来了。 所以不用抠“继承”这个字眼儿。一旦学过一些面向对象的软件工程,或者例如学过一点 UML 之类的,就熟悉了。
  • 打赏
  • 举报
回复
接口没有任何内涵,所以不可能从中继承任何东西。接口是定义对外公开的调用方法,例如你写
IABC x = y;
这个代码的时候,编译器就会去检查变量 y 的定义是否兼容接口 IABC,这样当你使用了一个不兼容的类型的变量时,编译器会拒绝编译。 否则,如果等到运行时才在某种特定的变量值的时候才在用户面前丢人地崩溃,或这样程序带病执行,那就不好玩儿了。
  • 打赏
  • 举报
回复
Class 通常都有不少预先写好的代码,子类可以继承使用这些实现内涵,可以对外公开调用方法。而接口不能写任何实现代码,没有血肉,只有最简单的形式。 c#、java 这类语言不支持多重继承,所以不得不用接口来模拟出来 c++ 那种多重继承特征。当你使用了接口,你就必须手动地在每一个子类去显式地去写委派代码来调用相同的一段公共代码,而Class 继承则完全不必自己手写代码。所以接口很麻烦,但是又不得不用,因为c# 并不支持多重继承,而多重继承其实是最多的现象。
加载更多回复(12)

110,538

社区成员

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

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

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