- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
发现许多作者可以互换使用术语“类型”和“类”。某些涵盖基于对象的模型的教科书也涵盖了术语“接口(interface)”。
有人可以根据一般的面向对象程序设计,特别是基于C++ / Java / object-oriented-database的简单术语来解释它们。
最佳答案
类型是数据的分类,告诉您数据的允许值和允许的操作是什么。 (几乎?)所有编程语言都有类型,尽管从一种语言到另一种语言,键入规则有很大不同。
类是OOP语言中一种特定的类型类型,它是用语言本身的特定语法定义的(与诸如Java的int
或float
之类的所谓“本机类型”相对,正确的语言)。通常根据内存布局和数据编码(所谓的成员变量)以及在其上起作用的函数(所谓的成员函数或方法)来定义类。
接口(interface)*是对类型必须执行的操作的说明,该操作应被视为给定的一组相似类型的一部分,但未指定允许的值,内存布局等。
这是一个非常非常非常简短的概述,是几种语言对这些方法的简化“平均形式”。它忽略了一些极端的情况和诸如C++的能力,使之成为接口(interface)和类之间的一部分。它还忽略了诸如Haskell之类的功能语言中的类,因为进一步伤害大脑并不是这里的目标。 ;)
编辑添加一些示例
这是一些类似于Java的声明,以帮助巩固这些概念。
int myVariable1;
myVariable1
是一种本机(或原始)类型,由以2s补码表示法编码的32位带符号整数值组成。它具有已知范围(大约-20亿到+20亿)和可用的一组已知操作(乘法,加法,除法,模数,减法,各种转换等)。
class MyClass
{
int myMemberVariable;
int myOtherMemberVariable;
int myMethod(int p) { myMemberVariable += p; myOtherMemberVariable = p; }
}
MyClass myVariable2 = new MyClass();
myVariable2
是由
类
MyClass
定义的类型。
MyClass
定义了内存布局(在这种情况下,内存布局由两个2s补码表示法的32位有符号整数组成)以及单个操作
myMethod()
,它将其参数添加到
myMemberVariable
并将
myOtherMemberVariable
设置为该参数。
interface MyInterface
{
int myInterfaceMethod(int p, int q);
}
MyInterface
仅声明一组操作(在此情况下为单个函数
myInterfaceMethod()
组成),没有任何成员变量且没有任何实现。它仅告诉您,确保实现此接口(interface)的任何类都具有带有名称+返回值+参数的特定签名的方法。要使用它,您必须创建一个实现接口(interface)的类。
class MyOtherClass implements MyInterface
{
int myMember1;
int myMember2;
int myMember3;
int myInterfaceMethod(int p, int q) { myMember1 = p; myMember2 = q; myMember3 = p - q; }
int myNonInterfaceMethod() { return myMember1; }
}
MyOtherClass myVariable3 = new MyOtherClass();
myVariable3
被定义为具有由三个带符号的32位整数和两个操作组成的内存布局的类型。这些操作之一是
由于整个implements MyInterface
部分而必须实现的操作。这样,任何期望(抽象)
MyInterface
类型的东西都可以使用(具体)
MyOtherClass
类型,因为可以保证操作在那里。另一种方法
myNonInterfaceMethod()
-
而不是来自MyInterface,因此,只希望
MyInterface
不能使用的东西,因为它不知道它的存在。
class BankAccount
{
String accountNumber;
float balance; /* DO NOT USE FLOATING POINT IN REAL FINANCIAL CODE! */
int transaction_limit;
float transaction(float change) {
balance += change > transaction_limit ? transaction_limit : change;
return balance;
}
}
String
类型),余额(本身就是
float
类型),但是
请勿在真实世界中使用 float 点FINANCIAL CODE!)和交易限制(本身就是
int
类型)。您还知道可以执行交易(通常称为
transaction
),该交易将对照交易限额检查更改并修改余额。 (为此,一个真实的类会包含更多内容,并且会包含很多我出于教学目的已删除的混淆性保护内容。)
interface Transactable
{
float transaction(float change);
}
class BankAccount implements Transactable
{
/* interior is identical */
}
class ReceivablesAccount implements Transactable
{
float balance;
float transaction(float change) { balance += change; }
}
Transactable
类型的信息都可以使用
BankAccount
的实例以及
ReceivablesAccount
的实例。他们不必知道银行帐户有交易限制,而应收帐款帐户则没有。他们不必了解数据的内部表示形式。他们不必知道任何特殊情况。他们只需要按名称了解一个函数(
transaction()
)就可以了。 (如果要对此进行更具体的实际使用,请查看收集类如何使用Java中的
Iterable
接口(interface),更不用说“for in”循环了。)
关于java - 类型,类,接口(interface)的含义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4615416/
我正在尝试在我的代码库中为我正在编写的游戏服务器更多地使用接口(interface),并了解高级概念以及何时应该使用接口(interface)(我认为)。在我的例子中,我使用它们将我的包相互分离,并使
我有一个名为 Widget 的接口(interface),它在我的整个项目中都在使用。但是,它也用作名为 Widget 的组件的 Prop 。 处理此问题的最佳方法是什么?我应该更改我的 Widget
有一个接口(interface)可以是多个接口(interface)之一 interface a {x:string} interface b {y:string} interface c {z:st
我遇到了一种情况,我需要调用第三方服务来获取一些信息。这些服务对于不同的客户可能会有所不同。我的界面中有一个身份验证功能,如下所示。 interface IServiceProvider { bool
在我的例子中,“RequestHandlerProxy”是一个结构,其字段为接口(interface)“IAdapter”,接口(interface)有可能被调用的方法,该方法的输入为结构“Reque
我有一个接口(interface)Interface1,它已由类A实现,并且设置了一些私有(private)变量值,并且我将类A的对象发送到下一个接受输入作为Interface2的类。那么我怎样才能将
假设我有这样的类和接口(interface)结构: interface IService {} interface IEmailService : IService { Task SendAs
有人知道我在哪里可以找到 XML-RPC 接口(interface)的定义(在 OpenERP 7 中)?我想知道创建或获取对象需要哪些参数和对象属性。每个元素的 XML 示例也将非常有帮助。 最佳答
最近,我一直在阅读有关接口(interface)是抽象的错误概念的文章。一篇这样的帖子是http://blog.ploeh.dk/2010/12/02/InterfacesAreNotAbstract
如果我有一个由第三方实现的现有 IInterface 后代,并且我想添加辅助例程,Delphi 是否提供了任何简单的方法来实现此目的,而无需手动重定向每个接口(interface)方法?也就是说,给定
我正在尝试将 Article 数组分配给我的 Mongoose 文档,但 Typescript 似乎不喜欢这样,我不知道为什么它显示此警告/错误,表明它不可分配. 我的 Mongoose 模式和接口(
我有两个接口(interface): public interface IController { void doSomething(IEntity thing); } public inte
是否可以创建一个扩展 Serializable 接口(interface)的接口(interface)? 如果是,那么扩展接口(interface)的行为是否会像 Serilizable 接口(int
我试图在两个存储之间创建一个中间层,它从存储 A 中获取数据,将其转换为相应类型的存储 B,然后存储它。由于我需要转换大约 50-100 种类型,我希望使用 map[string]func 并根据 s
我正在处理一个要求,其中我收到一个 JSON 对象,其中包含一个日期值作为字符串。我的任务是将 Date 对象存储在数据库中。 这种东西: {"start_date": "2019-05-29", "
我们的方法的目标是为我们现有的 DAO 和模型类引入接口(interface)。模型类由各种类型的资源 ID 标识,资源 ID 不仅仅是随机数,还带有语义和行为。因此,我们必须用对象而不是原始类型来表
Collection 接口(interface)有多个方法。 List 接口(interface)扩展了 Collection 接口(interface)。它声明与 Collection 接口(int
我有一个 Java 服务器应用程序,它使用 Jackson 使用反射 API 对 DTO 进行一般序列化。例如对于这个 DTO 接口(interface): package com.acme.libr
如果我在 Kotlin 中有一个接口(interface): interface KotlinInterface { val id: String } 我可以这样实现: class MyCla
我知道Java中所有访问修饰符之间的区别。然而,有人问了我一个非常有趣的问题,我很难找到答案:Java 中的 private 接口(interface)和 public 接口(interface)有什
我是一名优秀的程序员,十分优秀!