0

サービス URL を構築するために使用するさまざまな情報を返すために定義されたクラス メソッドを持つ基本クラスがあります。基本クラスには、その URL を構築するために定義されたインスタンス メソッドもあります。基本クラスにこのメソッドのデフォルトの実装を持たせたいので、URL を変更する必要がある場合にのみサブクラスでオーバーライドする必要があります。この基本メソッドでオーバーライドされたクラス メソッドを呼び出して、サブクラスのクラス メソッドを使用して URL を構築するにはどうすればよいですか? 以下は、動作していない現在のコードです。

基本クラスのメソッド:

- (NSString *)buildRequestUrlString{
    return [Utils serviceEndpointForOperationId:[[self class]operationId] version:[[self class] operationVersion] andRequestMethod:[[self class] methodType];
}

operationId、operationVersion、および methodType は、サブクラスに実装されるクラス メソッドですが、サブクラスが次の呼び出しを行う場合:

[super buildRequestUrlString];

サブクラスのクラス メソッドではなく、基本クラスのクラス メソッドを使用してエンドポイントを構築しています。そうならないようにするにはどうすればいいですか?それは可能ですか?

前もって感謝します、

ニック

4

3 に答える 3

1

selfの代わりに使用しsuperます。

[self buildRequestUrlString];

(または、あなたのケースでそれがうまくいかない理由を説明してください)。

コメントに応えて、クラスの分解が間違っているようです(または混乱しています)。具体的には、これが、すべて「使用するself」という 3 つの回答を受け取った理由である可能性があります。問題がどこにあるのかわかりません。

基本クラスがサブクラスからインスタンス メソッドを呼び出す必要がある場合は、サブクラスのインスタンスへの参照が必要です。つまり、あなたが持っていると言います:

@interface Concrete:Base

次に、Base は次のようなクラス メソッドを実装する場合があります。

+ baseWithConcreteQuantity:(int)aQuant
{
    return [[self alloc] initWithConcreteQuantity:aQuant];
}

そして、それは次のように使用されます:

[Concrete baseWithConcreteQuantity:10];

つまり、Objective-C のクラス メソッドは、他の言語の静的メソッドとは異なり、インスタンス メソッドと同様に継承されます。

ここで、インスタンス メソッドに関しては、常にsuperそのメソッドから特定のメソッドの の実装を呼び出します。を使用して基底クラスのsuperのメソッドを呼び出すことはほとんど行われておらず、何か他の問題があることを示しています。

同様に、基本クラスは、基本に存在しないサブクラスの機能を明確に呼び出そうとするべきではありません。

いえ

// in base
...
[self doSomething];
...

- (void)doSomething { ; }

// where a subclass might
- (void)doSomething { ... ; [super doSomething]; }
于 2012-06-12T20:07:00.500 に答える
0

「buildRequestUrlString」メソッドでは、[self class] は明らかに「基本クラス」タイプです。

オブジェクト継承ガイドラインは、親クラスからサブクラスのプロパティにアクセスしようとすることに強く同意しません。

これを解決するには、bbumが言ったことを実行するのに十分な速さで入力していないと思います;)

編集:これはハックであり、私が言ったことに反しますが、引数としてクラス名を渡すことができます:

- (NSString *)buildRequestUrlString:(Class)theClass{
    if (!theClass) theClass = [self class];
    return [Utils serviceEndpointForOperationId:[theClass operationId] version:[theClass operationVersion] andRequestMethod:[theClass methodType]];
}

[super buildRequestUrlString:[self class]];
于 2012-06-12T20:10:29.903 に答える
0

これにはテンプレートパターンを使用します。基本的に、基本クラスで 3 つのインスタンス メソッドを作成して、基本クラスで operationId などを取得します。これらは単に nil を返します。次に、サブクラスでこれら 3 つのメソッドをオーバーライドして、正しい値を返します。

buildRequestUrlString メソッドは [self operationId] などを使用します。

于 2012-06-12T20:20:18.387 に答える