2011-04-06 154 views
-1

我对OO相当陌生。如果我有两个需要交换数据的A和B类,或者调用对方的方法,我需要能够从类A访问类B的实例。我是否应该将实例对象的地址保存在全局变量中?我应该指定一个(单例)主类,并且使(指向)主类的A和B属性的实例? (AppDelegate浮现在脑海。)如何从另一个班级访问班级?

是否有一个直接的书面方式来实现呢?不知何故,我在这里错过了一些“最佳做法”。我查看了Apple的例子,但没有找到答案。

编辑:由于我相当新的MVC设计模式,我的问题基本上是“谁创造谁”?

我们在这里讨论一个音频播放器。 1.当用户选择一首歌曲时,UI会通过创建一个viewController来显示其波形,该viewController会创建相应的视图。 2.当用户点击播放时,用户界面通过在波形上覆盖新视图来播放歌曲时显示时间线。现在,后一种视图需要来自波形显示viewController的一些信息。现在,我在appDelegate的实例变量中存储一个指向viewController的指针。这工作,但感觉非常奇怪。

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

回答

3

类不是简单的代码部门。它们是创建对象的模板,您应该将其视为程序中的角色,在其责任区域内(您定义的内容 - 您决定每个对象的作用)进行相互作用。

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

方括号中的那些奇怪的表达式是消息表达式。几乎你所做的任何一个类或对象都会涉及一条或多条消息。您可以将消息发送到与对象相同的类,并且类可以像对象一样发送消息。在可可和Cocoa Touch中,通常有模型对象,视图对象,控制器对象,数据对象(如NSString,NS/UIImage和NSURL)以及辅助对象(如NSFileManager)。您为应用程序编写的类将主要是模型,视图和控制器对象(MVC)。该模型表示(模型)用户将看到他们自己操纵的内容;该视图将模型显示给用户;控制器实现了逻辑并确保模型被保存到永久存储中并从永久存储中加载。

欲了解更多信息,请参阅Object-Oriented Programming in Objective-CCocoa Fundamentals Guide

因为我对于MVC设计模式还是比较陌生的,所以我的问题基本上是“谁创造了谁”?

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

从程序的单根(通常是应用程序对象)向下通过控制器到模型和视图中的叶对象,保持所有权的直接树形图是很好的。如果两个物体彼此拥有,那就是一个问题。如果一个对象不属于它自己的类(单例)之外的任何东西,那通常也是一个问题 - 您需要更多地考虑代码所属的位置。 (Helper对象是主要的异常,其中大多数是单例,再次以NSFileManager为例,但它们并不多见。)

+0

哇,谢谢澄清。要回到我手边的问题,你的意思是,我的模型和我的观点不应该首先与对方交谈?一切都应该通过控制器发送。 – 2011-04-07 12:29:36

+0

@JoeVölker:对。使用标准视图时,控制器应将数据对象从模型传递到视图并返回。当使用自定义视图时,我通常会给我的自定义视图显示和编辑模型对象的属性。不同之处在于标准视图被设计为通用的,可以在任何应用程序中处理几乎任何模型,而我将为特定模型设计自定义视图。该模型从不与观点对话,应尽可能少地尽可能与控制器交谈。 – 2011-04-08 19:58:36

1

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

2

进一步的情况分析需要更多的信息。首先,您应该更多地指定类之间的关系,以及通过交换数据确切地说明您的意思。

应该避免单身。如果你想交换信息,通常通过某种方法或构造函数将类A的实例提供给类B的实例就足够了。然后B的实例能够调用A实例的公共方法(并访问公共属性)。

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

+0

更多信息:我的主视图的两个子视图代表我的数据。一个正在显示一个波形,另一个正在显示一个流经它的时间线。他们需要访问一些常用数据。现在,子视图在需要时被实例化并创建它们自己的表示,即,波形视图类从其音频数据的drawRect中创建波形图形。 – 2011-04-07 07:10:56

+0

我认为这取决于_common data_的类型。如果它们与输入数据相关,我会创建表示数据的不同对象并将其提供给两个视图。如果它与视图本身有关,也许你可以将两个视图包装到一个容器中,或者以不同的方式将它们统一起来。或者,也许你会来更聪明的东西... – Binus 2011-04-08 00:18:25

0

感谢您的贡献。另外,我发现有关this page的信息非常有用。它以亲身实践的方式和实用的语言阐述了可可的MCV考量。