0

Obj-C のチュートリアルをいくつか見てきました。デリゲート クラスはすべて から継承しNSObjectます。たとえば、applicationDidFinishLaunchingデリゲート メソッドは、一部のチュートリアルでは継承されていますが、NSObjectそれNSApplicationを実装しています。継承すべきではないと思う理由は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}};

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

2 に答える 2

1

これは非公式プロトコルと呼ばれます (ただし、GNUstep はドキュメンテーションの目的で GSAppDelegateProtocol として宣言しました) NSApplication は、デリゲート オブジェクトがメッセージに応答するかどうかを実行時に単純にチェックします (-respondsToSelector を使用:) デリゲートは、ビュー、文字列、プロキシ、セレクターに応答する限り何でも。すべての検証は実行時に行われるため、デリゲートにそのようなプロトコルのすべてのメソッドを実装させる必要はありません。見た目をすっきりさせるには、@interface で -applicationDidFinishLaunching: を再宣言するだけで済みますが、実際には必要ありませんが、@implementaiton で 1 つ作成するだけで十分です。

于 2013-01-10T18:53:42.240 に答える
0

代理人は、適切なものから継承できます。通常、特定のプロトコルを実装することになっています。プロトコルは、2つのクラス間の正式な通信インターフェイスを実装する方法です。ただし、デリゲートが通信パートナークラスから継承することは最も望ましくありません。

言い換えると、プロトコルは、多重継承の利用不可能性を克服するためによく使用されます。(Javaのインターフェースと非常によく似ています)

例:UIViewControllerサブクラスのインスタンスは、UITableViewを含むビューを制御します。外観またはデータを実装するためにUITableViewをサブクラス化するのではなく、テーブルビューオブジェクトに割り当てられた2つのデリゲートがあります。1つのデリゲートはカスタムレイアウトのプロバイダーとして機能し(ヘッダービューなどのアイテムを提供します)、もう1つのデリゲート(?)は表示されているデータを提供します。現在、このデリゲートは、NSObjectから継承し、2つのプロトコルを実装する任意のオブジェクトにすることができます。次に、このオブジェクトは、View Controllerによってインスタンス化され、テーブルに割り当てられます。ただし、View Controller自体が、それが制御するテーブルのデリゲートとして機能するのが一般的な方法です。これは良いパターンですが、厳密に話す必要はありません。それはどんなオブジェクトでもかまいません。これで、カスタムビューコントローラーはUITableViewController(既にプロトコルを実装し、ViewControllerから継承)から継承し、テーブルビューのデルゲートとして機能します。テーブルビュー自体は、UITableViewの任意のサブクラスにすることができます。(UITableViewのサブクラス化は通常お勧めできないため、これはここでは悪い例ですが)

デリゲートがどのクラスからも継承する必要がなく、プロトコルを実装するだけの場合は、少なくともcocoa基本クラスNSObjectから継承する必要があります。これにより、オブジェクトの通常の機能と動作をすべて継承することが保証されます。(initメソッド、copyメソッド、descriptionメソッドなど)これは、NSArray、NSLogなどのオブジェクトとして使用されるbeeingなど、フレームワークの他のクラスで適切に機能するために必要な場合があります。

于 2013-01-10T11:22:56.933 に答える