为什么我必须继承NSobject而不是NSapplication来实现GNUSTEP上的委托方法?

时间:2013-01-10 11:08:13

标签: objective-c gnustep

我见过几个Obj-C教程。委托类都继承自NSObject。例如,applicationDidFinishLaunching委托方法,在某些教程中,它继承自NSObjectNSApplication来实现它。我不认为它应该继承自NSObject的原因是我没有在其中找到任何委托协议声明,但我发现在NSApplication中委托协议声明。我的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}};

  .............................
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

代表可以继承任何适当的内容。通常应该实现某种协议。 协议是在两个类之间实现正式通信接口的一种方式。 但是,最不明智的是,代表将从其通信伙伴类继承。

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

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

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