回答
不,接口不是一个类。
一个接口是一组方法签名和可能属性,都涉及到一个单一的想法。例如,IList接口将具有索引,插入和获取元素数量的方法。但是,它没有定义任何实现细节。列表接口可以实现为链表或者封装数组,或者任何你想要的,只要它在接口中定义了这些方法即可。
类是从中创建实际对象的模板。类是方法签名的集合,以及这些方法的实现。
所以不,一个接口不是一个类,因为它只是定义了一个特定的契约,而一个类定义了该对象的整个行为。
评论员SquareCog准确地指出上述不完全正确。由于类可以被子类化,并且方法被覆盖,所以类与对象的实际行为的关系变得更加复杂。我只是想把这个问题说成是个别的实体。你可以阅读一个类的源代码,并且知道该类包含哪些行为。但是,在运行时,对象具有类型而不是类。类型是整个继承树,而不是单数类,因此类型的行为可以在几个不同的类上定义。幸运的是,这并没有改变基本的概念上的区别,即接口是可以暗示(通过名称,参数类型等)某些实现的契约,但不能强制执行除方法签名外的任何内容,而类确实定义了实现,即使这不是在运行时使用的实际实现。
肖恩,这是一个很好的措辞答案。我会小心地说,一个类定义了对象的行为 - 可以扩展(继承)一个类并完全重写内部。所以只是因为你知道什么是Foo,并不一定意味着你知道它是如何实现的(它实际上可能是Bar,Foo的叛逆之子)。 – SquareCog 2009-08-27 01:51:55
@肖恩,你的头像根本不适合你。 Plz考虑改变它。 – anonymous 2009-08-27 01:52:01
@SquareCog:真的,我没有考虑到这一点。我会通过声明类是个体实体来解决它,每个实体定义一个特定的行为,然后实际的对象的行为实际上由它的类型定义,这是它的继承树的合并。这样,我不必更改我的帖子; P – Sean 2009-08-27 01:59:16
可能有几个答案。不,一个类不是一个接口 - 一个接口定义一个契约,一个类是一种可以创建的对象。
是的,只有虚拟方法才能将接口视为基类 - 这就是接口在C++中的定义方式。
Java接口不是类;它是一个需要由类实现的方法声明;对能力的描述,如果你愿意的话。 Java中的抽象类是适当的类和接口之间的一个有趣的中间点,因为它们定义了可用的方法,但也提供了一些默认实现。
Java中抽象类和接口的根本区别在于,你只能扩展一个类;你可以实现多个接口。 抽象类描述你是什么;一个界面描述你可以做什么。你也定义你可以做什么 - 但它有更强的意义。
通常,接口是一种类型,可以通过类来实现,以表明该类通过一组方法公开行为。例如, 。Net有一个ICollection
接口,其中包含与集合交互的方法。
在C++中,接口是一个类,每个方法都是抽象的。
在Java和.Net中,接口是与类无关的独立类型。
无论哪种方式,类可以实现接口。
从逻辑上讲,它们非常相似。正如其他人所指出的那样,只有公共抽象成员的ABC 与接口的功能几乎相同。
当您深入了解它的细节时,两者有许多重要的不同之处。
- 一个类只能从一个基类继承,但可以实现多的接口。
- 已从ValueType派生的值类型不能从ABC继承,但可以实现接口。
- 一个类可以包含字段和静态成员。一个接口不能。
- 一个类可以包含实现,但一个接口不能。
- 一个类可以有私有和受保护的成员,但一个接口不能。
- ABC的抽象成员总是虚拟的。一个类可以实现与非虚拟成员的接口。
1:抽象基类
它有助于把.NET为具有三个“安全”种类型在.NET:接口,类和值类型(也有像指针等等,但这些是另一个故事),并且可以使用三个主要上下文类:存储位置,堆对象和通用约束。
堆对象可以是任何类型,但所有堆对象的行为都与类对象相似。接口类型的堆对象很少;它们通常不是在.net内创建的,但可以通过设计用于使用旧对象模型的代码来创建。类类型的堆对象包含每个字段的一个存储位置;值类型的堆对象包含一个类型为相关值类型的存储位置。
存储位置同样可以是任何类型,但是值类型的存储位置与其他位置不同。类类型或接口类型的存储位置包含类引用。值类型的存储位置包含值原语(字节,整数,字符,浮点数等),或者包含值类型的每个字段的存储位置(例如,类型为Point
的存储位置拥有类型为Int32
的两个存储位置,每个存储位置都包含一个带符号的32位整数基元)。
通用约束也可以是任何类型,但接口类型的约束不会将约束泛型类型参数本身限制为类类型,接口类型或值类型。声明为void Foo<T>(T param) where T:IWowzo
的方法可以使用类类型,接口类型或值类型的参数进行调用。如果使用值类型参数调用例程,则将param
和声明为T
类型的任何其他存储位置存储为值类型。如果使用类类型或整数类型的参数调用例程,则将param
和声明为T
类型的任何其他存储位置存储为类引用。值得注意的是,如果T
本身就是一种接口类型(IWozo
或衍生物),那么param
将作为对堆对象的引用传递,并且无论对象实例的类型是类对象还是行为类似值类型。如果结构Bar
实现IWowzo
,并且myBar
是Bar
类型的变量,调用Foo<Bar>(myBar)
可能产生与Foo<IWowzo>(myBar)
不同的语义;在前一种情况下,参数将表现为值类型,在后一种情况下,它将表现为类类型。
- 1. class and interface
- 2. 这对这种情况是有道理的 - class vs interface vs abstract?
- 3. PostSharp vs DynamicProxy2 Interface Interception
- 4. RESX vs Static Class
- 5. Ruby:initialize()vs class body?
- 6. PHP Singleton模式与abstract class和interface
- 7. Objective-C:@interface之前的@class指令?
- 8. 上述VS低于@interface
- 9. LAMBDA VS匿名VS Static Nested Class和
- 10. jquery accessor id vs class?
- 11. object-private Vs class-private
- 12. Factory class vs Spring DI
- 13. 类变量:“class list”vs“class boolean”
- 14. Visual Basic:Sub vs. Function and Module vs. Class
- 15. React 16中的class vs className
- 16. 铸造清单<Class>至清单<Interface>
- 17. abstract class和interface,面向对象编程的问题
- 18. 如何定义TypeScript`class`或`interface`的非序列化属性?
- 19. Class(Type)&IBOutlet for Interface Builder视图之间的关系
- 20. 结帐后出现“Invalid token','in class,struct或interface'
- 21. 将ICollection <Interface>转换为ICollection <Class> [UWP] c#6.0
- 22. Interface Builder中'Object Identity'面板中的'Class Actions'在哪里?
- 23. GlassFish 4,Grizzly Framework 2.3.23:实例无法初始化。 Class = interface org.glassfish.grizzly.http.server.AddOn
- 24. 'class'与'object'有关,因为'interface'与...有关?
- 25. VS 2005 Class Diagram查看格式
- 26. C++ struct vs Class在内存方面
- 27. Clojure:(double 0)vs(cast(class 0.0)0)
- 28. Iterator.class VS迭代<String>的.class
- 29. Yii2中:: class vs :: className()的区别?
- 30. Class vs函数返回对象
什么语言/环境? – SLaks 2009-08-27 01:33:55
PLZ查看更新。 – anonymous 2009-08-27 01:36:02