0

だから私はobjective-cにかなり慣れていないので、プロトコルに頭を悩ませようとしています。私の質問を説明するために例を使用します。

さまざまなメソッドを実行する「Calculate」クラスがあるとします。「Calculate」で同じメソッドを実行する「Class1」と「Class2」もあります。

私の理解では、プロトコルを使用して、継承を必要とせずに「Calculate」からメソッドにアクセスできます(したがって、Class1とClass2で同じコードを複製する必要がありません)。

私の理解では、Class1 と Class2 にプロトコルを実装する必要があるため、とにかくこれらのメソッドを入力する必要があります。では、プロトコルのポイントは何ですか?

Class1とClass2のスーパークラスにせずに「Calculate」のメソッドを使いたい。そこで、プロトコルの調査を開始しました。ドキュメントを読みましたが、これがどのように達成されているのかまだわかりません。素人のプロトコルを説明できる人がいれば、それはありがたいです。

4

5 に答える 5

2

継承により、コードを複製する必要がなくなります。プロトコル (他のプログラミング言語がインターフェイスと呼ぶもの) は、OOP の Can-Do 構造を実装します。クラスがプロトコルを実装するとき、そのクラスは特定のメソッドのセットを実行できると言っています。適切と思われる方法でメソッドを実装するのは、そのクラス次第です。

Apple からの開発者リファレンスは次のとおりです。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html

于 2012-05-29T18:03:18.713 に答える
2

プロトコルは、一連のメソッド宣言です。その主な目的は、クラス間の柔軟な関係を可能にすることです。

さまざまなクラスにロギング メッセージを送信させたいとしますが、メッセージが送信された後に何が起こるかを知る責任をクラスに負わせたくないとします。次に、ConsoleWriter クラスと DiskWriter クラスによって実装される Logger プロトコルを作成します。メッセージを送信したいクラスは、どちらと話しているかを知りません。として知っている何かと話すだけid<Logger>です。

于 2012-05-29T18:05:14.317 に答える
1

あなたが経験した言語の種類はわかりません。しかし、Object-C プロトコルは .NET のインターフェイスに非常に似ています。その目的は、オブジェクトの実際の「タイプ」を知る必要はなく、何ができるかだけを知るために、コントラクト (インターフェイス、フットプリントなど) を定義することです。

そうは言っても、いくつかのプロパティとメソッドを持つプロトコル「MyProtocol.h」を定義できます。次に、このプロトコルをクラスに実装できます。クラスのヘッダーにプロトコルのメンバーを追加する必要はありませんが、実装に具体的な実装を記述するだけで済みます。

これにより、タイプではなく、定義されたインターフェイスでオブジェクトを参照できるようになります。したがって、実際のクラス タイプの代わりに id タイプを使用できます。

お役に立てれば。

于 2012-05-29T18:03:24.747 に答える
1

プロトコルは、移植可能なヘッダー ファイルのようなものです。それらは、プロトコルに準拠する任意のクラスによって実装できる、または実装する必要があるメソッドを記述します。これは、サブクラスがそのスーパークラスのメソッドを自動的に実装し、それらのメソッドをサブクラスごとにオプションでオーバーライドできる継承とは異なります。

あなたには OOP のバックグラウンドがあると思われるので、サブクラスはスーパークラスの特殊化された、またはより具体的なバージョンであることが非常に多いということ以外は、サブクラス化にはあまり触れません。つまり、すべてのサブクラスはそのスーパークラスの一種ですが、すべてのスーパークラスが必ずしもサブクラスのタイプであるとは限りません。

ObjC のプロトコルは、ClassA が ClassB が何らかのアクションを実行できることを知る必要があるデリゲート パターンでよく使用されます。次に例を示します。

// ClassA.h
#import "ClassB.h"

@interface ClassA <ClassBProtocol>
// Some variables
@end

// ClassA.m
@implementation ClassA
- (id)init {
    if ( (self = [super init]) ) {
        ClassB *classB = [[ClassB alloc] init]; // Create an instance of ClassB
        classB.delegate = self; // Set ourself as the delegate which means we want ClassB to tell us what to do
    }
    return self;
}

// Introduced by ClassBProtocol
- (void)doSomethingCoolWithString:(NSString *)string {
    // Do something here, it's up to ClassA what to do
}
@end


// ClassB.h
@protocol ClassBProtocol <NSObject>
- (void)doSomethingCoolWithString:(NSString *)string;
@end


@interface ClassB
@property (nonatomic, weak) id <ClassBProtocol>delegate;
// Some variables
@end


//ClassB.m
@implementation ClassB
@synthesize delegate;

- (id)init {
    if ( (self = [super init]) ) {
        if (delegate && [delegate respondsToSelector:@selector(doSomethingCoolWithString:)]) {
            [delegate doSomethingCoolWithString:@"A String"];
        }
    }
    return self;
}
@end
于 2012-05-29T18:08:02.030 に答える
-1

以下の単純なプロトコルとプロパティの例:

---> ViewController.h ファイル

#import <UIKit/UIKit.h>
#import "MyVC.h"

@interface ViewController : UIViewController<MyVCProtocol>
{
    IBOutlet UILabel *label;
    IBOutlet UIButton *btnPush;
    MyVC *vc;
}
-(IBAction)Buttonclicked;
@end

---> ViewController.m ファイル

#import "ViewController.h"

@implementation ViewController

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
}

-(IBAction)Buttonclicked
{
    vc = [[MyVC alloc]initWithNibName:@"MyVC" bundle:nil];
    vc.delegate=self;
    [self.navigationController pushViewController:vc animated:YES];
}

-(void)GetText:(NSString *)text
{
    label.textAlignment=UITextAlignmentCenter;
    label.text=text;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end

---> MyVC.h ファイル

#import <UIKit/UIKit.h>

@protocol MyVCProtocol <NSObject>

-(void)GetText:(NSString *)text;

@end

@interface MyVC : UIViewController
{
    IBOutlet UITextField *m_TextField;
    IBOutlet UIButton *m_Button;
    id <MyVCProtocol> delegate;
}
@property(nonatomic, retain)id <MyVCProtocol> delegate;
-(IBAction)ButtonClicked;
@end

---> MyVC.m ファイル

#import "MyVC.h"

@implementation MyVC
@synthesize delegate;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
}

-(IBAction)ButtonClicked
{
    [delegate GetText:m_TextField.text];
    [self.navigationController popViewControllerAnimated:YES];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end
于 2012-05-29T19:34:15.970 に答える