老规矩,在代码理论之前,先对根底学问做一个提高。
1、面向对象中的多态(Polymorphism)是指一个对象能够具有多种不同的形态或表现方式。简单来说,就是同一个类型的对象,在不同的上下文中表现出不同的行为。多态性是面向对象的三大特性之一(封装、继承、多态)。
咕泡P6:Java互联网高级架构师5期 下栽地止:http://daxiacode.com
2、在多态中,父类的援用能够指向子类的对象,经过父类的援用调用子类的办法。这样能够完成代码的灵敏性和扩展性,能够依据详细的对象类型调用相应的办法,无需关怀对象的详细类型。
3、经过多态性,能够经过统一的接口来处置不同的对象,完成代码的简约性和可维护性。多态性提供了一种笼统的方式来处置对象的不同行为,使得代码更具灵敏性和可扩展性。
总结一句,就是同一个办法在不同的对象实例中,能够有不同的行为。这里简单用PHP举一个案例。
在PHP中完成多态需求遵照以下几个步骤:
1、创立父类(基类):定义一个包含通用办法和属性的父类。
class Animal {
public function makeSound() {
echo "Animal makes sound.";
}
}
2、创立子类(派生类):继承父类,并添加本人特定的办法和属性。
class Dog extends Animal {
public function makeSound() {
echo "Dog barks.";
}
}
class Cat extends Animal {
public function makeSound() {
echo "Cat meows.";
}
}
3、创立对象并调用办法:经过父类的援用来实例化子类对象,能够依据详细的对象类型调用相应的办法。
$animal1 = new Dog();
$animal1->makeSound(); // Output: Dog barks.
$animal2 = new Cat();
$animal2->makeSound(); // Output: Cat meows.
经过以上步骤,我们能够完成多态性,即相同父类类型的对象(例如Animal),在不同的对象实例下调用相应的子类办法(例如Dog或Cat)。这样就完成了多态的效果。
Go言语完成
由于Go中没有面向对象的概念,但依据多态的定义和特性,我们能够运用Go中的interface来完成多态。
package main
import "fmt"
type Animal interface {
run()
}
type Turtle struct {
}
func (t Turtle) run() {
fmt.Println("乌龟匍匐很慢")
}
type Rabbit struct {
}
func (r Rabbit) run() {
fmt.Println("兔子跑步很快")
}
func main() {
var animal Animal
// 实例化一个Turtle对象
animal = &Turtle{}
animal.run()
// 实例化一个Rabbit对象
animal = &Rabbit{}
animal.run()
}
1、首先我们定义了一个Animal的接口,并在接口中定义了一个约束,就是run()办法。
2、接着我们定义了Turtle和Rabbit两个构造体,并分别定义了一个run()办法。
3、此时两个构造体隐式的完成了Animal接口中的办法。
4、依据多态的特性,两个构造体中的办法,都能够具备本人的行为。我们在两个办法中分别打印了内容,此时可以打印出不同的内容。不同的内容就能够了解为不同的行为,当然你也能够在这个办法中做其他的操作。
5、在main()办法中,创立一个Animal的变量,并经过不同的构造体实例,调用相同的办法名,最终输出不同的内容。
实战案例
上面对多态有了一定的理解,接着罗列一个实战的案例。
在系统支付,普通我们会对接微信和支付宝这样的平台,大致的流程就是,创立订单记载->组装支付参数->发起支付恳求->支付平台停止回调通知->修正订单支付状态。
基于这样的逻辑,我们运用一个Pay接口,定义三个办法。
type Pay interface {
createOrder() // 创立订单
createPay() // 常见支付参数
notifyPay() // 回调通知
}
接着定义详细的完成类,就是微信支付和支付宝支付。
1、定义一个微信支付,用来完成接口中的三个办法。
type WeChat struct {
// 微信支付方式
}
func (a WeChat) createOrder() {
fmt.Println("我是微信支付,如今我正在创立订单数据,用于记载到数据库中。")
}
func (a WeChat) createPay() {
fmt.Println("我是微信支付,如今我正在创立支付数据,用于向微信发起支付恳求运用。")
}
func (a WeChat) notifyPay() {
fmt.Println("我是微信支付,如今我正在承受微信通知的参数,用于修正用户订单支付状态。")
}
2、定义一个支付宝支付,用来完成接口中的三个办法。
type Ali struct {
// 支付宝支付方式
}
func (a Ali) createOrder() {
fmt.Println("我是支付宝支付,如今我正在创立订单数据,用于记载到数据库中。")
}
func (a Ali) createPay() {
fmt.Println("我是支付宝支付,如今我正在创立支付数据,用于向支付宝发起支付恳求运用。")
}
func (a Ali) notifyPay() {
fmt.Println("我是支付宝支付,如今我正在承受支付宝通知的参数,用于修正用户订单支付状态。")
}
接下来,就来停止实践的订单操作。
1、假定当前的支付渠道运用的是微信支付。
func main() {
var pay Pay
pay = &WeChat{}
pay.createOrder()
pay.createPay()
pay.notifyPay()
}
最终输出的结果为:
我是微信支付,如今我正在创立订单数据,用于记载到数据库中。
我是微信支付,如今我正在创立支付数据,用于向微信发起支付恳求运用。
我是微信支付,如今我正在承受微信通知的参数,用于修正用户订单支付状态。
2、假定当前的支付渠道运用的是支付宝支付。
func main() {
var pay Pay
pay = &Ali{}
pay.createOrder()
pay.createPay()
pay.notifyPay()
}
最终输出结果为:
我是支付宝支付,如今我正在创立订单数据,用于记载到数据库中。
我是支付宝支付,如今我正在创立支付数据,用于向支付宝发起支付恳求运用。
我是支付宝支付,如今我正在承受支付宝通知的参数,用于修正用户订单支付状态。
到此,在Go中完成面向对象以及三大特性(封装、继承和多态)就给大家分享终了。
有疑问加站长微信联系(非本文作者)