Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 范围及;对象之间的通信_Language Agnostic_Oop - Fatal编程技术网

Language agnostic 范围及;对象之间的通信

Language agnostic 范围及;对象之间的通信,language-agnostic,oop,Language Agnostic,Oop,我在Delphi(和Delphi术语)工作,但我的问题是语言中立的 假设您有一个类TClient,它向另一个类TFacade发送消息。我假设TClient实例将有一个类型为TFacade的私有引用变量。TClient中的某个方法将创建TFacade的实例并将其分配给这个私有变量。TClient客户端类需要使用TFacade类 同时,TFacade与其他类(称为WorkerClass1、WorkerClass2和WorkerClass3)一起工作。TFacade实例可能也做同样的事情——它们有私有

我在Delphi(和Delphi术语)工作,但我的问题是语言中立的

假设您有一个类TClient,它向另一个类TFacade发送消息。我假设TClient实例将有一个类型为TFacade的私有引用变量。TClient中的某个方法将创建TFacade的实例并将其分配给这个私有变量。TClient客户端类需要使用TFacade类

同时,TFacade与其他类(称为WorkerClass1、WorkerClass2和WorkerClass3)一起工作。TFacade实例可能也做同样的事情——它们有私有WorkerClass变量,并创建WorkerClass的实例(可能在TFacade构造函数中)。TFacade类需要使用WorkerClass单元

那么,信息是如何从Workerclass返回到TClient的呢?例如,如果TClient是一个表单,它可能会接收用户输入,TFacade使用用户输入,Workerclass也会使用用户输入。但是,在Workerclass处理或使用信息之后,它们需要将信息传回TClient(即,输出信息将以TClient形式显示)

我希望这是清楚的。基本上我只是问如果Class1调用Class2中的一个方法,Class2调用Class3中的一个方法,Class3如何将信息发送回Class1?既然我是个新手,不要害怕你的回答太简单或太具体。我能应付:-)


谢谢,一如既往——Al C.

一种可能的方法是使用回调,请参阅。

一种可能的方法是使用回调,请参阅。

信息可以在函数参数中传递,也可以通过函数的返回值返回。

信息可以在函数参数中传递,它可以通过函数的返回值返回

我希望这是清楚的。基本上我只是问如果Class1调用Class2中的一个方法,Class2调用Class3中的一个方法,Class3如何将信息发送回Class1

但事实并非如此,因为这样会将设计中的类别紧密地结合在一起

相反,Class3只与Class2通信。这样一来,Class1需要对Class3一无所知,反之亦然。通过这种方式,您可以交换Class1和Class3,而不必更改除Class2之外的任何内容

还有其他更高级的习惯用法可以进一步减少耦合,但这就足够了

我希望这是清楚的。基本上我只是问如果Class1调用Class2中的一个方法,Class2调用Class3中的一个方法,Class3如何将信息发送回Class1

但事实并非如此,因为这样会将设计中的类别紧密地结合在一起

相反,Class3只与Class2通信。这样一来,Class1需要对Class3一无所知,反之亦然。通过这种方式,您可以交换Class1和Class3,而不必更改除Class2之外的任何内容


还有其他更高级的习惯用法可以进一步减少耦合,但这对于您来说已经足够开始了。

您有许多选择,可以进行权衡。根据您想要实现的目标,某些选项可能不“好”:

  • 使用函数参数和返回值移动数据位
  • 使用引用/输出参数收集数据
  • 使用回调函数/委托
  • 使用事件(如果语言支持)
  • 使用一个收集所有感兴趣信息的通用实例
  • 让class1实现稳定的接口,它可以被class3使用
  • 使用中央存储,如公共内存、文件、数据库等
  • 检查设计模式
  • 检查平台中的习惯用法

您有许多选择,但需要权衡。根据您想要实现的目标,某些选项可能不“好”:

  • 使用函数参数和返回值移动数据位
  • 使用引用/输出参数收集数据
  • 使用回调函数/委托
  • 使用事件(如果语言支持)
  • 使用一个收集所有感兴趣信息的通用实例
  • 让class1实现稳定的接口,它可以被class3使用
  • 使用中央存储,如公共内存、文件、数据库等
  • 检查设计模式
  • 检查平台中的习惯用法