如何从另一个类访问一个类?

时间:2011-04-06 22:55:17

标签: objective-c cocoa oop

我对OO很新。如果我有两个需要交换数据的类A和B,或者调用彼此的方法,我需要能够从类A访问类B的实例。我应该在全局变量中维护实例对象的地址吗?我应该指定一个(单例)主类,并指定(指向)主类的A和B属性的实例吗? (AppDelegate浮现在脑海中。)

是否有直接的书本方式来实现这一点?不知怎的,我在这里错过了一些“最佳实践”。我查看了Apple的例子,但没有找到答案。

编辑:由于我对MVC设计模式还不熟悉,我的问题基本上是“谁创造了谁”?

我们在这里谈论音频播放器。 1.当用户选择一首歌曲时,UI会通过创建一个创建适当视图的viewController来显示其波形。 2.当用户点击播放时,UI在播放歌曲时显示时间线,方法是在波形上叠加新视图。现在,后一个视图需要波形显示viewController的一些信息。现在,我在appDelegate的实例变量中存储了一个指向viewController的指针。这有效,但感觉非常奇怪。

我是否应该将两个类所需的信息外包给每个班级可以轻松访问的第三个实体?

4 个答案:

答案 0 :(得分:3)

类不仅仅是代码部门。它们是用于创建对象的模板,您应该将其视为程序中的参与者,在其职责范围内(您定义 - 您决定每个对象的作用)并相互交互。

虽然您可以像处理对象一样处理类,但类通常不会相互通信。大多数情况下,您将创建和使用类的实例 - 这是我们通常所说的“对象” - 并让这些实例相互通信。一个对象发送另一个消息,告诉接收者做某事或改变接收者的一个属性。这些消息是程序对象之间的交互。

方括号中的那些奇怪的表达式是消息表达式。几乎所有关于类或对象的操作都将涉及一条或多条消息。您可以将消息发送到与对象相同的类,并且类可以像对象一样发送消息。

在Cocoa和Cocoa Touch中,通常包含模型对象,视图对象,控制器对象,数据对象(如NSString,NS / UIImage和NSURL)以及辅助对象(如NSFileManager)。您为应用程序编写的类主要是模型,视图和控制器对象(MVC)。该模型表示(模型)用户将看到自己操纵的内容;视图向用户显示模型;控制器实现逻辑并确保模型保存到持久存储中并从中加载。

有关详细信息,请参阅Object-Oriented Programming in Objective-CCocoa Fundamentals Guide

  

由于我对MVC设计模式还不熟悉,我的问题基本上是“谁创造了谁”?

控制器创建并加载模型,并加载视图,并将模型传递给视图以供显示。某些控制器也可能会创建其他控制器。

最好从程序的单个根保留一个简单的树状图表 - 通常是应用程序对象 - 通过控制器向下移动到模型和视图中的叶对象。如果两个物体彼此拥有,那就是一个问题。如果一个对象不属于它自己的类之外的任何东西(单例),那通常也是一个问题 - 你需要更多地思考该代码所属的位置。 (辅助对象是主要的例外;大多数都是单例。再次,请参阅NSFileManager以获取示例。但它们很少而且很远。)

答案 1 :(得分:2)

进一步的情况分析需要更多信息。首先,您应该更多地指定类之间的关系以及通过交换数据到底意味着什么。

一般应避免单身人士。如果要交换信息,通常可以通过某种方法或构造函数向类B的实例提供类A的实例。然后,B的实例能够调用A实例的公共方法(和访问公共属性)。

通过搜索“设计模式”可以学习一些“最佳实践”。

答案 2 :(得分:1)

您应该决定一个类是否可以是另一个类的对象(封装),或者一个类是否可以从另一个类继承(继承)。如果这些都不是一个选项,那么也许你可以让一个类(或它的一些成员)静态?

答案 3 :(得分:0)

感谢您的贡献。另外,我发现this page的信息非常有用。它以实践的方式和实用的语言为可可制定MCV考虑因素。