分派的概念

本文介绍了分派的概念,包括单分派和多分派(双分派),并详细阐述了静态分派和动态分派的原理。在高级语言如C++、Java中,通常只支持单分派,而双分派则需要通过特定技巧来实现,如动态单分派+静态单分派。文章通过示例展示了如何在C++中模拟双分派,以降低应用场景与实际功能的耦合度,遵循迪米特法则。
摘要由CSDN通过智能技术生成

分派是一个过程,这个过程用来确定应用场景中具体使用的是哪个方法函数,比如在代码中可以有n个重名的甚至重参数的方法,那么具体使用的是哪个函数呢,这个对函数的确认过程即分派。

 

那么分派的准则是什么呢?是宗量,一个方法所属的对象叫做方法的接收者,方法的接收者与方法的参量统称做方法的宗量。在此基础上,分派分为单分派和多分派两种。

 

单分派根据一个宗量类型对方法进行选择,多分派(双分派)根据多个(两个)宗量对方法进行选择。

 

而目前的高级语言大都是单分派语言(c++/java/c#),具体分派方式根据阶段又分为两种:

一种是静态分派,即方法的分派发生在代码的编译阶段,对应的实现技术为函数重载,这时编译器只根据重名方法的不同参数来判断具体使用哪个方法。也就是我们所说的编译时多态。

一种是动态分派,即方法的分派发生在代码的执行阶段,对应的实现技术为函数重写,这时程序里只根据函数具体接收者来判断具体使用哪个类的方法。也就是我们所说的运行时多态。动态分派是根据运行时具体实际参数的类型来判断调用哪个函数的。这里多说一嘴,其实函数的具体接收者本质也是一个参数,参数的名称为this。

 

也就是说我们平时使用面向对象的继承、派生、多态特性即可满足我们大部分的工作需要,但是双分派的作用也是相当大的,你给函数参数传入的是基类指针(c++),双分派能根据实际指向的派生类的类型来选择具体使用哪个函数,然而c++、java等高级语言都没有实现,我们来看看静态分派,动态分派,双分派(c++虽然没有实现,但是我们也把期望的代码写了出来)的具体应用:

 

//Problem.h
class CProblem
{
public:
	CProblem(void){}
	virtual ~CProblem(void){}

	void comm_func();
	void comm_func(int a);
};

//Problem.cpp
#include <stdio.h>
#include "Problem.h"
void CProblem::comm_func()
{
	printf("problem common function 1 in \n");
}
void CProblem::com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值