0

我看过几个 Obj-C 教程。委托类都继承自NSObject. 例如,applicationDidFinishLaunching委托方法,在一些教程中,它继承自它NSObjectNSApplication要实现它。我认为它不应该继承的原因NSObject是我没有在其中找到任何委托协议声明,但我在 NSApplication.xml 中找到了委托协议声明。我的 Objective-C 玩具环境是 GnuSep。

这是一些代码:

@interface browserController : NSObject //here. inheriting from NSObject,but NSObject don'have any protocols declaration about applicationDidFinishLaunching.
{
  NSBrowser *browser;
}
@end

@implementation browserController

- (void)menuAction:menuItem
{
  ..............................

}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
  NSWindow *win;
  ActiveBrowserDelegate * abd;
  WindowDelegate *wd;
  NSRect wf = {{100, 100}, {600, 500}};
  NSRect bf = {{10, 10}, {580, 350}};

  .............................
}
4

2 回答 2

1

它被称为非正式协议(尽管 GNUstep 出于文档目的将其声明为 GSAppDelegateProtocol)NSApplication 将在运行时简单地检查它,如果您的委托对象将响应消息,(使用 -respondsToSelector :) 委托可以是一个视图,一个字符串,一个代理,只要你让它响应选择器。您不需要让您的委托实现此类协议中的每个方法,因为所有验证都将在运行时完成。为了让它看起来更干净,你可以在 @interface 中重新声明 -applicationDidFinishLaunching: 虽然你并不真的需要,但在 @implementaiton 中创建一个就足够了。

于 2013-01-10T18:53:42.240 回答
0

委托可以继承任何适当的东西。它通常应该实现某种协议。协议是在两个类之间实现正式通信接口的一种方式。但是,委托最不可能从其通信伙伴类继承。

换句话说:协议通常用于克服多重继承的不可用性。(很像Java中的接口)

示例:UIViewController 子类的实例控制包含 UITableView 的视图。与其将 UITableView 子类化以实现其外观或数据,不如将两个委托分配给表视图对象。一个委托充当自定义布局的提供者(提供诸如标题视图之类的项目),另一个(?)委托提供正在显示的数据。现在,这个委托可以是任何对象,继承自 NSObject 并实现这两个协议。这个对象冷然后由视图控制器实例化并分配给表。然而,通常的做法是视图控制器本身充当它所控制的表的委托。这是一个很好的模式,但严格来说不是必需的。它可以是任何物体。现在自定义视图控制器继承自 UITableViewController(它已经实现了协议并继承自 ViewController)并充当表视图的委托。表格视图本身可以是 UITableView 的任何子类。(虽然这是一个不好的例子,因为子类化 UITableView 通常是不可取的)

如果委托不需要从任何类继承而只是实现协议,那么它至少应该从可可基类 NSObject 继承。这确保了它继承了任何对象的所有常用功能和行为。(初始化方法、复制方法、描述方法等)可能需要与框架的其他类一起正常工作,例如在 NSArray、NSLog 等中用作对象的beeing。

于 2013-01-10T11:22:56.933 回答