2017-07-17 6 views
0

私はObjective Cを非常に新しくしています。私はウェブ上で検索しようとしましたが、良いコンテクストがないため、検索結果が私の要求に合わないようです。派生クラスメソッドをプロトコルメソッドに委譲するにはどうすればよいですか?

私はプロトコルPで宣言されたfooメソッドを持っています。 interface DerivedはPから継承し、fooの実装を提供します。私はプロトコルPを継承する別のinterfaceAnotherDerivedを持っています。 AnotherDerivedのメソッドからfooに呼び出しを委譲して、派生メソッドが呼び出されるようにしたいと思います。

@protocol P <NSObject> 
@required 

- (NSString *)foo; 

@end 

@interface Derived: NSObject <P> 
- (NSString *)foo 
{ 
    return _foo; 
} 
@end 

@interface AnotherDerived: NSObject <P> 
- (NSString *)foo 
{ 
    return [super foo]; <----------------- I need something like this. It should call method of Derived 
} 
@end 

これを行う方法はありますか?

+0

質問を少し抽象化できますか?私は私とPとfooが続くのは難しいと思う。もっと具体的に説明できますか? – Fogmeister

+0

不快感をおかけして申し訳ありません。私は詳細を追加しています。 –

+0

[super foo]を呼び出すには、AnotherDerivedをDerivedから継承する必要があります。 –

答えて

3

2つのクラスが同じプロトコルを実装しているだけであるため、2つのクラス間に何らかの関係があるとは限りません。 fooメソッドのAnotherDerivedには、他のクラスがあることは知られていません。Derivedfooも実装されています。

あなたはAnotherDerivedfooで明示的にDerivedのインスタンスを割り当てて、それを使用することができます

@interface AnotherDerived: NSObject <P> 
- (NSString *)foo 
{ 
    Derived *d = [Derived new]; 
    return [d foo]; 
} 
@end 

それとも、潜在的にクラスメソッドとしてfooを宣言することができます:

@protocol P <NSObject> 
@required 

+ (NSString *)foo; 

@end 

@interface Derived: NSObject <P> 
+ (NSString *)foo 
{ 
    return _foo; 
} 
@end 

をしかし、あなたはまだだろう明示的に呼び出す必要がありますfooDerived

@interface AnotherDerived: NSObject <P> 
+ (NSString *)foo 
{ 
    return [Derived foo]; 
} 
@end 

最後に、AnotherDerivedDerivedから継承していることを他の人が指摘している可能性があります。

+0

組成は私のためにうまくいった。ありがとうございました! –

1

私が正しく理解していれば、あなたのDerivedPを実装し、あなたのAnotherDerivedDerivedで実装fooを呼び出すことになっていますか?あなたはDerivedからAnotherDerived継承を行う必要があります。Derivedはすでにそれを行うため

@interface AnotherDerived: Derived 
- (NSString *)foo 
{ 
    return [super foo]; 
} 

の必要はありませんが、AnotherDerivedPを実装するために。

関連する問題