今天给各位分享php面向对象的多态怎么理解的知识,其中也会对php实现多态的方式进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录:
面向对象的多态详解 !!
面向对象的软件开发语言具有三个重要的特点分别为封装性、继承性、多态性。封装性即意味着对象封装其内部的数据,使其对外不可见,以保证数据的安全性。继承性是代码复用的一个很好的解决方案,但是继承关系是编译器在编译阶段就为所有的对象决定的,因而在软件工程过程中,继承性太过死板,存在很大的局限性。而多态性,它是将多种不同的特殊行为进行抽象的一种能力,通过结合继承性,多态性很好地解决了OO遇到的很多麻烦,使得面向对象的编程方式最终得到淋漓尽致的推广。
多态性和泛型编程
各种编程语言都内置了多种基本数据结构并且支持自定义数据类型,因而程序员在程序设计过程中可能会遇到多种数据类型,而针对这些数据类型的逻辑操作很有可能是雷同的。此时为每一种数据类型都设计出相应的逻辑函数似乎已经变得很不现实,因而泛型编程孕育而生了。泛型编程的出现,可以说在软件工程领域里是一个极大的进步。利用泛型编程,我们可以不为特定的类型进行专门编码,而采用对不同类型进行通用编码的方式来解决应对大量数据类型的问题。C++
STL是泛型编程的成功案例。利用Template函数,STL成功实现了对多种数据类型进行泛化的效果。而OO通过接口或者抽象类进一步实现了对类的泛化,也就是在面向对象过程中出现的新名词—多态!
多态性特点
简单来说,多态是具有表现多种形态的能力的特征,在OO中是指,语言具有根据对象的类型以不同方式处理,即指同样的消息被不同类型的对象接收时导致完全不同的行为,是对类的特定成员函数的再抽象。多态性在不同的编程语言中拥有不同的解决方案,但多态性的最终目标却始终不变,都是“以不变应万变”。
两种多态方式
一般来说,多态主要是存在两种类型:编译时的多态和运行时的多态。
1
编译时的多态主要是通过函数重载来实现的。所谓函数重载是指保持函数名不变,主要通过更改函数形参的个数以及形参的类型来定义出多个同名函数来实现对多种类型数据的逻辑处理。这种类型的多态关系是编译器在编译阶段就已经在函数调用的地方确定的,因而运行过程中速度较快,但功能比较局限。
2
运行时的多态在不同的语言中拥有不同的实现方案。C++通过虚函数的晚捆绑来实现,而Java通过面向接口编程和面向抽象编程来实现动态调用相应的函数实现。但归根结点,这些语言都是通过将多种特殊实现的类抽象为一个泛化类来实现运行多态。
面向接口编程
软件工程中程序涉及到的对象越多,对象之间相似的概率越大,因而这时候抽象变成了可能。通过定义接口,程序设计者可以成功实现对方法的定义和实现的分离,因而应用程序不必考虑子类成员函数中是如何实现内部逻辑细节,只需知道该类对象向外公开的接口便可成功操纵这类对象。而这种编程方式,为以后程序的改动以及程序的健壮性和扩展性都提供了一个比较理想的解决方案。因此面向抽象编程已经成为OO界强烈推崇的编程方式。
OO思想已经深入广大编程人员的工作中,如何能够充分合理利用OO的特点达到最优化软件体系结构将会成为每一个OO程序员应该思考的问题,相信OO思想能够为大家的软件设计带来前所未有的效果。
怎样理解面向对象中的多态?尤其是体现在java中
所谓多态:就是父类的引用指向new 子类();
多态的前提:必须要有extends 或者implements。
多态主要是体现在接口和重载,接口能够让一个类有多种不同的实现方式,便于代码的重构。
例如:
java"class Person{
void add(){}
}
class Student extends Person{
void add(){System.out.println("super");}
void ss(){}
}
public class Demo{
public static void main(String[] args){
Person p = new Student();
p.add(); //如果子类重写了add,输出子类
// p.ss(); //由于是Person的引用,所以调用不到Student的方法。
Student s = (Student)p; //向下转型
s.ss(); //可以正常访问
}
}
面向对象的多态性,通俗点解释一下
多态是类型理论的一个概念。
意思是:
一个名字可以代表许多不同的对象,只要这些对象都有共同的父类,这样这个名字代表的不同对象就可以以不同的方式来响应同一消息。
这是抽象的解释,我觉得实际上多态就是用来将接口与实现分离的。
如:
class Tuxing { //我定义一个图形类来作为接口
public:
virtual void hua() const = 0; //绘制图形
virtual void cachu() const = 0; //擦出图形
// ....
};
class Zhengfangxing {//定义正方形作为实现
public:
void hua() const {
//实现画正方形的操作
}
void cachu() const {
//实现擦除正方形的操作
}
//实现其他接口
};
class Sanjiaoxing {//定义Sanjiaoxing作为实现
public:
void hua() const {
//实现绘制三角形的操作
}
void cachu() const {
//实现擦出三角形的操作
}
//实现其他操作
};
我的用户代码想使用这些图形,因为TuXing是接口,所以客户只需使用TuXing就行了!
//useTuxing函数使用户代码
void useTuxing(Tuxing *use) {
//use这个名字可以代表正方形,三角形等对象,
//这些对象都有一个共同的父类Tuxing
//这样这个名字代表的不同对象就可以以不同的方式
//实现同一消息
use-draw();
//....
use-cachu();
}
int main() {
Zhengfangxing one;
useTuxing(one);
Sanjiaoxing two;
useTuxing(two);
}
就是这样将接口与实现分离。我建议你买一些国外的书看看吧!
有问题加我扣
php中什么是多态?
多态就是同一个行为,作用不同的对象返回的结果不一样,这个用处挺大的
面向对象中的多态的理解
简单来说,多态是具有表现多种形态的能力的特征,在OO中是指,语言具有根据对象的类型以不同方式处理之,特别是重载方法和继承类这种形式,的能力。多态被认为是面向对象语言的必备特性。
多态有多种分类,通过了解这些分类可以更丰满对其认识,在这里就不再罗列,请各位参考 wiki大百科 和 javaworld .
多态与泛型(generic)
多态实际上就是泛型。
所谓泛型就是指我们不为特定的类型进行专门编码,而采用对不同类型进行通用编码的方式,无论是数据结果还是算法。
传统的泛型是指类似以Template function的方式使参数一般化,典型的应用是C++ STL,比如List、Vector以及algorithm。
而OO已能通过接口(Interface)和抽象类(Abstract Class)进行真正意义上的泛型了。在我看来,这就是OO最精彩的地方,也就是多态的威力。而对于传统意义上的Generic,我始终觉得其作用已经今不如昔了。
多态和继承(Inheritance)
严格来说,多态与继承、重载并不是孤立的,他们之间存在着紧密的联系,多态是建立在这两者的基础之上的(实际上继承就有用重载这一特性)。
传统的多态实际上就是由虚函数(Virtual Function)利用虚表(Virtual Table)实现的(早期C模拟OO特性时使用最多,C++的实现也是,后来的技术未作研究,是否使用VT不得而知),自然是离不开继承,换句话说多态实际上覆盖了继承。
正是由于继承与多态的紧密联系,使得我们很容易张冠李戴,那么如何区别呢?
举个常用的例子:
Abstract Class Sharp implement IHaveSide {
public bool isSharp(){
return true;
}
public abstract int getSides();
}
Class Triangle extends Sharp {
public override int getSides() {
return 3;
}
}
Class Rectangle extends Sharp {
pubilc override int getSides() {
return 4;
}
}
那么这种类的关系叫做继承,下面这种使用方式也是继承所带来的:
Triangel tri = new Triangle();
println("Triangle is a type of sharp? " + tri.isSharp());
而这种方式则是多态:
Sharp sharp = new Rectangle();
println("My sharp has " + sharp.getSides() + " sides.");
这两者区别在哪?很显然,继承是子类使用父类的方法,而多态则是父类使用子类的方法。
其技术上的区别是绑定时期,晚期绑定一定是多态。
php面向对象的多态怎么理解的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于php实现多态的方式、php面向对象的多态怎么理解的信息别忘了在本站进行查找喔。