本篇文章给大家谈谈如何定义和实现接口,以及如何定义接口和实现接口对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
今天给各位分享如何定义和实现接口的知识,其中也会对如何定义接口和实现接口进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
Java接口的定义与实现
方法的实现是指可以在{}中写具体的Java代码,接口只能是以()结尾,
public void tree();//方法的定义
//方法的具体实现
public void tree(){
system.out.println("这是一颗松树");
}
C语言接口的定义与实现
一个模块有两部分组成:接口和实现。接口指明模块要做什么,它声明了使用该模块的代码可用的标识符、类型和例程,实现指明模块是如何完成其接口声明的目标的,一个给定的模块通常只有一个接口,但是可能会有许多种实现能够提供接口所指定的功能。每个实现可能使用不同的算法和数据结构,但是它们都必须符合接口所给出的使用说明。客户调用程序是使用某个模块的一段代码,客户调用程序导入接口,而实现导出接口。由于多个客户调用程序是共享接口和实现的,因此使用实现的目标代码避免了不必要的代码重复,同时也有助于避免错误,因为接口和实现只需一次编写和调试就可多次使用
实现
一个实现导出一个接口,它定义了必要的变量和函数以提供接口所规定的功能,在C语言中,一个实现是由一个或多个.c文件提供的,一个实现必须提供其导出的接口所指定的功能。实现应包含接口的.h文件,以保证它的定义和接口的声明时一致的。
Arith_min和Arith_max返回其整型参数中的最小值和最大值:
int Arith_max(int x, int y) {
return x y ? x : y;
}
int Arith_min(int x, int y) {
return x y ? y : x;
}
Arith_div返回y除以x得到的商,Arith_mod返回相应的余数。当x与y同号的时候,Arith_div(x,y)等价于x/y,Arith_mod(x,y)等价于x%y
当x与y的符号不同的时候,C的内嵌操作的返回值就取决于具体的实现:
eg.如果-13/5=2,-13%5=-3,如果-13/5=-3,-13%5=2
标准库函数总是向零取整,因此div(-13,2)=-2,Arith_div和Arith_mod的语义同样定义好了:它们总是趋近数轴的左侧取整,因此Arith_div(-13,5)=-3,Arith_div(x,y)是不超过实数z的最大整数,其中z满足z*y=x。
Arith_mod(x,y)被定义为x-y*Arith_div(x,y)。因此Arith_mod(-13,5)=-13-5*(-3)=2
函数Arith_ceiling和Arith_floor遵循类似的约定,Arith_ceiling(x,y)返回不小于实数商x/y的最小整数
Arith_floor(x,y)返回不超过实数商x/y的最大整数
完整实现代码如下:
arith.c
抽象数据类型
抽象数据类型(abstract data type,ADT)是一个定义了数据类型以及基于该类型值提供的各种操作的接口
一个高级类型是抽象的,因为接口隐藏了它的表示细节,以免客户调用程序依赖这些细节。下面是一个抽象数据类型(ADT)的规范化例子--堆栈,它定义了该类型以及五种操作:
stack.h
实现
包含相关头文件:
#include <stddef.h
#include "assert.h"
#include "mem.h"
#include "stack.h"
#define T Stack_T
Stack_T的内部是一个结构,该结构有个字段指向一个栈内指针的链表以及一个这些指针的计数:
struct T {
int count;
struct elem {
void *x;
struct elem *link;
} *head;
};
Stack_new分配并初始化一个新的T:
T Stack_new(void) {
T stk;
NEW(stk);
stk-count = 0;
stk-head = NULL;
return stk;
}
其中NEW是一个另一个接口中的一个分配宏指令。NEW(p)将分配该结构的一个实例,并将其指针赋给p,因此Stack_new中使用它就可以分配一个新的Stack_T
当count=0时,Stack_empty返回1,否则返回0:
int Stack_empty(T stk) {
assert(stk);
return stk-count == 0;
}
assert(stk)实现了可检查的运行期错误,它禁止空指针传给Stack中的任何函数。
Stack_push和Stack_pop从stk-head所指向的链表的头部添加或移出元素:
void Stack_push(T stk, void *x) {
struct elem *t;
assert(stk);
NEW(t);
t-x = x;
t-link = stk-head;
stk-head = t;
stk-count++;
}
void *Stack_pop(T stk) {
void *x;
struct elem *t;
assert(stk);
assert(stk-count 0);
t = stk-head;
stk-head = t-link;
stk-count--;
x = t-x;
FREE(t);
return x;
}
FREE是另一个接口中定义的释放宏指令,它释放指针参数所指向的空间,然后将参数设为空指针
void Stack_free(T *stk) {
struct elem *t, *u;
assert(stk *stk);
for (t = (*stk)-head; t; t = u) {
u = t-link;
FREE(t);
}
FREE(*stk);
}
完整实现代码如下:
#include <stddef.h
#include "assert.h"
#include "mem.h"
#include "stack.h"
#define T Stack_T
struct T {
int count;
struct elem {
void *x;
struct elem *link;
} *head;
};
T Stack_new(void) {
T stk;
NEW(stk);
stk-count = 0;
stk-head = NULL;
return stk;
}
int Stack_empty(T stk) {
assert(stk);
return stk-count == 0;
}
void Stack_push(T stk, void *x) {
struct elem *t;
assert(stk);
NEW(t);
t-x = x;
t-link = stk-head;
stk-head = t;
stk-count++;
}
void *Stack_pop(T stk) {
void *x;
struct elem *t;
assert(stk);
assert(stk-count 0);
t = stk-head;
stk-head = t-link;
stk-count--;
x = t-x;
FREE(t);
return x;
}
void Stack_free(T *stk) {
struct elem *t, *u;
assert(stk *stk);
for (t = (*stk)-head; t; t = u) {
u = t-link;
FREE(t);
}
FREE(*stk);
}
如何定义一个接口?
定义接口\x0d\x0a 使用interface来定义一个接口。接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成。定义接口的基本格式如下:\x0d\x0a\x0d\x0a[修饰符] interface 接口名 [extends 父接口名列表]{\x0d\x0a[public] [static] [final] 常量;\x0d\x0a[public] [abstract] 方法;\x0d\x0a}\x0d\x0a修饰符:可选,用于指定接口的访问权限,可选值为public。如果省略则使用默认的访问权限。\x0d\x0a接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。\x0d\x0aextends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口。当使用extends关键字时,父接口名为必选参数。\x0d\x0a方法:接口中的方法只有定义而没有被实现。\x0d\x0a\x0d\x0a例如,定义一个用于计算的接口,在该接口中定义了一个常量PI和两个方法,具体代码如下:\x0d\x0a\x0d\x0a[java] view plaincopy\x0d\x0apublic interface CalInterface \x0d\x0a{ \x0d\x0a final float PI=3.14159f;//定义用于表示圆周率的常量PI \x0d\x0a float getArea(float r);//定义一个用于计算面积的方法getArea() \x0d\x0a float getCircumference(float r);//定义一个用于计算周长的方法getCircumference() \x0d\x0a} \x0d\x0a注意:\x0d\x0a 与Java的类文件一样,接口文件的文件名必须与接口名相同。\x0d\x0a实现接口\x0d\x0a接口在定义后,就可以在类中实现该接口。在类中实现接口可以使用关键字implements,其基本格式如下:\x0d\x0a[修饰符] class <类名 [extends 父类名] [implements 接口列表]{\x0d\x0a}\x0d\x0a修饰符:可选参数,用于指定类的访问权限,可选值为public、abstract和final。\x0d\x0a类名:必选参数,用于指定类的名称,类名必须是合法的Java标识符。一般情况下,要求首字母大写。\x0d\x0aextends 父类名:可选参数,用于指定要定义的类继承于哪个父类。当使用extends关键字时,父类名为必选参数。\x0d\x0aimplements 接口列表:可选参数,用于指定该类实现的是哪些接口。当使用implements关键字时,接口列表为必选参数。当接口列表中存在多个接口名时,各个接口名之间使用逗号分隔。\x0d\x0a 在类中实现接口时,方法的名字、返回值类型、参数的个数及类型必须与接口中的完全一致,并且必须实现接口中的所有方法。例如,编写一个名称为Cire的类,该类实现5.7.1节中定义的接口Calculate,具体代码如下:\x0d\x0a\x0d\x0a[java] view plaincopy\x0d\x0apublic class Cire implements CalInterface \x0d\x0a{ \x0d\x0a public float getArea(float r) \x0d\x0a { \x0d\x0a float area=PI*r*r;//计算圆面积并赋值给变量area \x0d\x0a return area;//返回计算后的圆面积 \x0d\x0a } \x0d\x0a public float getCircumference(float r) \x0d\x0a { \x0d\x0a float circumference=2*PI*r; //计算圆周长并赋值给变量circumference \x0d\x0a return circumference; //返回计算后的圆周长 \x0d\x0a } \x0d\x0a public static void main(String[] args) \x0d\x0a { \x0d\x0a Cire c = new Cire(); \x0d\x0a float f = c.getArea(2.0f); \x0d\x0a System.out.println(Float.toString(f)); \x0d\x0a } \x0d\x0a} \x0d\x0a 在类的继承中,只能做单重继承,而实现接口时,一次则可以实现多个接口,每个接口间使用逗号“,”分隔。这时就可能出现常量或方法名冲突的情况,解决该问题时,如果常量冲突,则需要明确指定常量的接口,这可以通过“接口名.常量”实现。如果出现方法冲突时,则只要实现一个方法就可以了。
简述一下如何让一个类实现一个接口
有三步如何定义和实现接口:
1)定义接口
2)在类上实现接口
3)使用接口
以C#为例(JAVA也是同样的)
// 1)定义接口
public interface MyInterface
{
void SomeMethed(int a, int b);
}
// 2)在类上实现接口
public class MyClass : MyInterface
{
// (类的其他代码)
// 实现接口
public void SomeMethod(int a, int b)
{
// 实现代码
}
}
// 3)使用接口
MyInterface mi = new MyClass();
mi.SomeMethod(10, 20);
怎么在PHP中定义和使用接口interface
1、接口的定义
如何定义和实现接口:
接口:一种成员属性为抽象的特殊抽象类
如何定义和实现接口,在程序中同为规范的作用
2、其实他们的作用很简单,当有很多人一起开发一个项目时,可能都会去调用别人写的一些类,那
如何定义和实现接口你就会问,我怎么知道他的某个功能的实现方法是怎么命名的呢,这 个时候PHP接口类interface就起到作用
如何定义和实现接口了,当我们定义了一个接口类时,它里面的方式是下面的子类必须实现的,比如 :
interface Shop
{
public function buy($gid);
public function sell($gid);
public function view($gid);
}
我声明一个shop接口类,定义了三个方法:买(buy),卖(sell),看(view),那么继承此类的所有子类都必须实现这3个方法少一个都 不行,如果子类没有实现这些话,就无法运行。实际上接口类说白了,就是一个类的模板,一个类的规定,如果你属于这类,你就必须遵循我的规定,少一个都不 行,但是具体你怎么去做,我不管,那是你的事,如:
class BaseShop implements Shop { public function buy($gid) { echo('你购买了ID为 :'.$gid.'的商品'); } public function sell($gid) { echo('你卖了ID为 :'.$gid.'的商品'); } public function view($gid) { echo('你查看了ID为 :'.$gid.'的商品'); } }
结论 : PHP接口类interface就是一个类的领导者,指明方向,子类必须完成它指定方法。这样不同的开发者就不要去了解别人怎么命名相应的方法。
3、php中使用接口(interface)实现多重继承:
我们都知道PHP中的类(class)是单继承的,那是不是就没有办法实现多重继承了呢?答案是否定的.我们可以通过其它特殊的方式实现类的多重 继承,比如使用接口(interface)实现,只要把类的特征抽象为接口,并通过实现接口的方式让对象有多重身份,通过这样就可以模拟多重继承了。
下面是一个用接口(interface)实现多重继承的例子,源代码如下:
<?php
interface UserInterface{ //定义User的接口
function getname();
}
interface TeacherInterface{ //teacher相关接口
function getLengthOfService();
}
class User implements UserInterface { //实现UserInterface接口
private $name = "tom";
public function getName(){
return $this-name;
}
}
class Teacher implements TeacherInterface { //实现TeacherInterface接口
private $lengthOfService = 5; // 工龄
public function getLengthOfService(){
return $this-lengthOfService;
}
}
// 继承自User类,同时实现了TeacherInterface接口.
class GraduateStudent extends User implements TeacherInterface {
private $teacher ;
public function __construct(){
$this-teacher = new Teacher();
}
public function getLengthOfService(){
return $this-teacher-getLengthOfService();
}
}
class Act{
//注意这里的类型提示改成了接口类型
public static function getUserName(UserInterface $_user){
echo "Name is " . $_user-getName() ."<br";
}
//这里的类型提示改成了TeacherInterface类型.
public static function getLengthOfService(TeacherInterface $_teacher){
echo "Age is " .$_teacher-getLengthOfService() ."<br";
}
}
$graduateStudent = new GraduateStudent();
Act::getUserName($graduateStudent);
Act::getLengthOfService($graduateStudent);
//结果正如我们所要的,实现了有多重身份的一个对象.
?
示例运行结果如下:
Name is tom
Age is 5
4、接口类和抽象类的区别
抽象类 :1.类中至少有一个抽象方法
2.前面加abstract
接口: 1.成员属性为常量const
2.前面不用加abstract
3.类中全部为抽象方法,接口抽象方法为public
5、接口类和抽象类 共同点:
1.本身不能被实例化,必须继承或者引用
2.继承和引用后,抽象方法必须重载才能实例化
关键字 interface.引用关键字 implements
关于如何定义和实现接口和如何定义接口和实现接口的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
如何定义和实现接口的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于如何定义接口和实现接口、如何定义和实现接口的信息别忘了在本站进行查找喔。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~