2012-02-02 21 views
0

私は7つのカスタムオブジェクトcreateDateとmodifiedDateを持っています。私はObject1を受け入れるメソッドを作成することができますが、実際には7つのオブジェクトすべてを取ることができますか?同じ特性を持つ複数のカスタムオブジェクト

は今、これは動作します:

[self setCreateAndModifiedTimeWithEvent:((Object1 *) object2 
           WithCreateDate:[[eventsArray objectAtIndex:i] objectForKey:@"create_date"] 
           AndModifiedDate:[[eventsArray objectAtIndex:i] objectForKey:@"modified_date"]]; 

.hファイル

-(void) setCreateAndModifiedTimeWithEvent:(Object1 *)object 
          WithCreateDate:(NSString *)createStamp 
          AndModifiedDate:(NSString *)modifiedStamp; 

.mファイル

-(void) setCreateAndModifiedTimeWithEvent:(Object1 *)object 
          WithCreateDate:(NSString *)createStamp 
          AndModifiedDate:(NSString *)modifiedStamp 

{ 
    object.A = @"Hello,"; 
    object.B = @"World"; 
} 

これはコードの行の良いチャックに削減します。

私はあなたがUIViewとそのサブクラスでこの種のことをすることができることを知っています。私は

((UIScrollView *)myTextField).tag = 2; 

を行うことができます

UITextField myTextField. 

はこのように私のオブジェクトを型キャストについて、本質的に何も悪いがあるか、それが許容可能である持っていると言いますか?ジョーのように

+1

"私のオブジェクトをタイプキャストすることに本質的に悪いことはありますか?" - はい、継承を使用しません!同じ基本クラスからすべてを派生させるか、プロトコルを作成してください。 – Joe

答えて

3

は、あなたがこのような何かを持つ方が良いだろう、と述べた:

@interface DatedObject : NSObject 

@property NSDate *createDate; 
@property NSDate *modifiedDate; 

@end 

@implementation DatedObject 

@synthesize createDate; 
@synthesize modifiedDate; 

@end 

はその後7クラスのそれぞれは、DatedObject基本クラスから継承しています。継承はオブジェクト指向プログラミングの基本的な部分であり、それを(賢明に)使用することを学ぶべきです。

次に、あなたの方法をすることができ:またプロトコルでこれを行うことができますが、他のクラスから継承することを基本クラスを使用してのいいところは、あなただけのこの機能を実装しなければならないということです

-(void) setCreateAndModifiedTimeWithEvent:(DatedObject *)object 
          WithCreateDate:(NSString *)createStamp 
          AndModifiedDate:(NSString *)modifiedStamp; 

一つの場所へ。 7つのクラスすべてが現在同じ基本クラス(DatedObjectのスーパークラスになる)から継承していない場合は、おそらくプロトコルが使えます。その場合は、次のようにあなたの方法で宣言することができます:あなたがあなたの質問に投稿したものを介してこれらの二つのアプローチに大きな利点の

-(void) setCreateAndModifiedTimeWithEvent:(id<DatedObjectProtocol>)object 
          WithCreateDate:(NSString *)createStamp 
          AndModifiedDate:(NSString *)modifiedStamp; 

一つをあなたはどこの場所をキャッチするには、コンパイラからより多くの助けを得ることですあなたのコードはそれに応答しないオブジェクトにメッセージを送ります。

+0

k、継承を実装しました。一度あなたとジョーはそれを言った、私はかなり/顔をした。ガイダンスのおかげで。 – Padin215

+0

私はあまりにも怠け者だったので、答えるため+1。また、@ Log139はObj-Cが動的言語であるため、あなたがしていたことがうまくいっていることを幸運にしていたことに注意してください。そのような構造体をよりプリミティブな型で同じことをしようとしていた場合は、メモリレイアウトに関する問題にぶつかります。 – Joe

+0

OK、DatedOjbectを受け入れ、Object1のプロパティにアクセスしようとすると、Object1(DatedObjectのサブクラス)を渡すメソッドがあるとは言えません。私はそれをObject1にキャストし、Object1のプロパティにアクセスすることができます。これでいい? – Padin215

1

Andrewの答えは正しいです。

しかし、何らかの理由であなたが共通の基底クラスやプロトコルを作成したくない場合は、常にこのよう、idにメソッドパラメータの種類を設定できますの

-(void) setCreateAndModifiedTimeWithEvent:(id)object 
         WithCreateDate:(NSString *)createStamp 
         AndModifiedDate:(NSString *)modifiedStamp; 

パラメータidコンパイル時には(NSArrayの値のような)型チェックをしないので、コンパイラの警告を出さずに任意のメソッドを呼び出すことができます(慎重でないと明らかに危険です)。

キャストなしでid変数にドット表記を使用することはできませんが、異なる無関係の型からキャストするよりも、IDからコンクリート型にキャストする方が良いです。

コードの可読性を除いて実際には違いはありません。

+0

うん、私はキャスト入力しようとする前にこれを試して、それは働いた。 – Padin215

関連する問題