0

私は、Objective-C の世界で最初のつまずきの一歩を踏み出し、この主題に関する本を執筆しています。カスタムクラスを作成して使用するという概念を内面化する段階に来ました。

そして、これらの基本的な概念と原則を正しく理解することが、私の今後の Objective-C の学習の鍵であると思うので、概念をある程度正しく理解しているかどうかを確認したかっただけです。

したがって、カスタム クラスを作成するときは、パブリック クラス ヘッダー ファイルとクラス実装ファイルという 2 つの別個のファイルで作成されることがわかりました。そして、この概念を内面化するために、私はこれを、観客の前でトリックを行う「魔術師」にたとえて比喩的に理解しました。

ヘッダー ファイルは、マジシャンが上演する劇場の外のポスターのようなものです。入る前に、マジシャンがどのように見えるか (プロパティ)、彼 (主に「彼」) が実行できるトリック (メソッド)、および彼がマジックトリックを行うことができるもの (型宣言) を確認できます。 )。したがって、このマジシャンの「公開」ポスター (ヘッダー ファイル) から、彼が実行できるマジックの種類と使用している小道具を理解できます。おそらく、この特定のマジシャンが偉大な Houdini からいくつかのトリックを学んだという言及もあるでしょう (Houdini はクラスの遺産であり、Houdini はスーパークラスです)。

バックステージを許可されていれば、彼がどのようにトリックを行っているかを実際に見ることができます。つまり、マジシャンの実装ファイルを見ることができます。

この比喩は、カスタム クラスの概念をどのように理解できるかという線に沿っているでしょうか?

しかし、クラス メソッドとインスタンス メソッドの概念がこの比喩とどのように関連しているかは、まだよくわかっていません。

インスタンス メソッドは、マジシャンのこの特定の「インスタンス」がこの特定のショーで実行しているトリックのカテゴリに属し、クラス メソッドは現代のマジシャンが実行できるトリックであると言えますか? 第三に、メソッドが「型」を使用する方法が少し混乱しています。インターフェースファイルで事前に宣言されているように見えるものもあれば、メソッド内でその場で「宣言」されているように見えるものもありますか?

「Magician」クラスを使用した例を挙げると、ヘッダー ファイルに関する私の理解は次のようになります。

@interface Magician : NSHoudini

// Instance method that given a variable of type rat it will turn this into something of type rabit 

-   (rabit) FromRatToRabit: (rat) aRat;

@end 

実装ファイルは次のようになります。

#import “Magician.h”

@implementation Magician

rabit aRabit 
// rabit being the type and aRabit the variable


-   (rabit) FromRatToRabit:(rat)aRat;
{

// some magic code goes here which will take what’s in the aRat variable, of type rat
// and turn it into a form of type rabit and return it in the aRabit variable 

aRabit
}
@end

上記が正しければ、メソッドに「フィード」する aRat 変数が宣言されていないのはなぜでしょうか? または、メソッド記述で使用している場合、宣言は完了したと見なされますか?

4

2 に答える 2

2

あなたの比喩は受け入れられます。ヘッダーは、他のファイルが参照するインターフェイスであり、そのクラス/ファイルとそれに対応する実装ファイル (存在する場合) からアクセスできるものを伝えます。

Magician は Houdini のサブクラスであることに気付きました。私はあなたの例を誤解しているだけかもしれませんが、継承に関してはおそらく間違っています。あなたが言っているのは、すべてのマジシャンは Houdini の一種だということです。フーディーニは魔術師の一種であると言うのはおそらく逆であろう。

クラスとインスタンスは何度も説明されており、Objective C に固有のものではないため、あまり詳しく説明しません。 ここにいくつかの良い答えがある投稿があります。基本的に、クラス関数/変数はクラス自体に属し、そのクラスのインスタンスに固有のものではありません。クラス関数/変数の別の言葉は、static関数または変数です。

最後の質問の意味がわかりません。目的 c のすべてのポインター/変数には型があります。ただし、構文がめちゃくちゃです。投稿したコードはおそらく次のようになります(そして、うさぎのスペルを修正しました:-P)

@interface Houdini : Magician

// Instance method that given a variable of type rat it will turn this into something of type rabit 

- (Rabbit *) FromRatToRabit: (Rat *) aRat;

@end 

#import “Houdini.h”

@implementation Houdini

Rabbit *aRabbit; // this is an ivar, although you're not actually using it anywhere, I'm just correcting your syntax


- (Rabbit *) fromRatToRabit:(Rat *)aRat;
{

// some magic code goes here which will take what’s in the aRat variable, of type rat
// and turn it into a form of type rabit and return it in the aRabit variable 

  [aRat doSomethingToReturnRabbit]; // assuming rat has an instance function that returns a rabbit
}
@end

そして、次のようなことを行うことでこの関数を使用できます

Houdini *myHoudini = [[Houdini alloc] init];
Rat *houdinisRat = [[Rat alloc] init];
Rabbit *houdinisRabbit = [myHoudini fromRatToRabbit:houdinisRat];

これは、(提供していない) ラット クラスとウサギ クラスの存在に依存することに注意してください。また、通常はデフォルトの初期化子を使用しています。

これがお役に立てば幸いです。個別に質問がある特定のトピックをさらに検索してみてください。十分な資料が用意されているためです。

于 2012-10-02T07:58:03.953 に答える
0

これは、パブリック インターフェイスと非表示の実装の違いを理解するための優れた比喩です。「Houdini」がスーパークラスであり、クラス メソッドが「すべてのトリック」であるという 2 つの大きな誤解があります。

継承階層の妥当性を評価する一般的な教科書的な方法は、サブクラスのインスタンスが「スーパークラスの」インスタンスであるかどうかを評価することです。これは実際には非常に抽象的になる可能性がありますが、たとえば、Magician's Guild の医療保険給付処理ソフトウェアなどを設計している場合、そのコンテキストでは Magician は Houdini ではない何かです! 彼らはすべてフリーランサーであり、すべてのマジシャンは「」1099請負業者 (自営業の収入に対する米国の納税申告書) であるか、またはそのようなものであるとします。別の考え方としては、マジシャンは「ステージ パフォーマー」、「エンターテイナー」などと考えることもできます。いつもこのようなソフトウェアを作りたいと思っているわけではありませんが、コンセプトを学ぶのに役立つと思います。

あなたが苦労しているとあなたが言った 2 番目のことは、クラス メソッドについて考える方法でした。型に固有のクラス メソッドの動作と情報を考慮し、どのインスタンスにも依存しないようにします。福利厚生ソフトウェアの例に戻ると、マジシャン ギルドのメンバー全員が 401k (別の米国の税法、退職口座) を取得し、給与ごとに $X の定義された貢献があるとします。これは年功序列によって変化するものではないと仮定すると、これはクラス レベルで保持するのに適した情報になります。したがって、マジシャンが実行できるすべてのトリックはクラス メソッドではありません。マジシャンはそれらを実行するため、それらはインスタンス メソッドになります。おそらく、(危険すぎるため) 禁止されたトリックのリストは、クラス メソッドである可能性があります。これは、マジシャンに固有のルールですが、どのマジシャンからも独立しています。

最後に、タイプに関する 3 番目の質問ですが、あなたが何を求めているかはある程度推測できますが、よくわかりません。メソッドがあると言う

- (void)myMethod:(id)myArgument
{
    NSLog(@"myArgument = %@",myArgument);
}

次に、どこmyArgumentで宣言されているか尋ねていますか?これはメソッド シグネチャで宣言されており、メソッドへのパラメーターであり、メソッド本体のスコープ内 (中括弧内) で参照できます。それが「その場で」という意味かどうかはわかりません。残念ながら、疑似コードではなく、実際のソース コードをいくつか提供し、疑問に思っている特定の場所を指摘する必要があります。

そして、用語に関するいくつかのマイナーなポイント、申し訳ありませんが、これは長くなってしまいました-メソッドに値を「供給する」という用語は、通常「パラメーター」または「引数」として「渡す」ことです。メソッドの「説明」は通常、メソッド シグネチャまたは宣言と呼ばれますが、プロトタイプと呼ばれることもあります。はい、型や型宣言などで何を話しているのかを明確にしてください。私はあなたの質問について 100% 明確ではありません。

お役に立てれば!

于 2012-10-02T07:57:44.343 に答える