2

たとえば、次のクラスがあります。

  1. MyGradientButton.h/.m
  2. RedGradientButton.h/.m (背景色が赤の MyGradientButton クラスを継承します)

これで、MyGradientButton クラスの特性を持つインスタンス化されたオブジェクト「buttonA」ができました。ただし、後で「buttonA」クラスを RedGradientButton に変更し、ボタンを赤に変えるこの新しいクラス特性を取得することは可能ですか?

可能であれば、方法を教えてください。ありがとうございました

4

2 に答える 2

3

いいえ、作成後にクラスのタイプを変更することはできません。[1]

最善のアプローチは、通常、クローンを作成するメソッドを作成することです。この場合のクラス変数は、通常、メッセージを送信するオブジェクトです。

この形式の一般的な例は次のとおり[NSString stringWithString:s]です[NSMutableString stringWithString:s];

ビューを扱っているため、多くの場合、内部型を定義してオブジェクト構成を使用する方が簡単です。したがって、タイプはありませんが、RedGradientButton代わりMyGradientButtonに (たとえば)characteristicsメンバーを持つタイプがあります。次に、複数の特性タイプを作成できます (サブクラス化が本当に適切な設計である場合)。


[1]できますが、しないでください…誰かがそれを達成する方法を教えてくれたら. 理由: 安全ではないため、1 つのアプローチが廃止されます。メソッドを更新するクラスを設定できますが、これを行ってもオブジェクトの他の側面は変更されません。明らかなケースは、メンバー レイアウトの違いを反映するようにオブジェクトのサイズが変更または更新されないことです。つまり、オブジェクトにメッセージを送信し、サブクラスに存在するがスーパークラスには存在しないメンバーにアクセスすると、メソッドの実装は読み取りまたは書き込みを行います。無効なメモリ (これは未定義の動作です)。機能しているように見えたり、動的に証明したり、安全であることを保証するためにできる限りのことを行ったりした場合でも、最新のランタイムは壊れにくいオブジェクト ABI を使用します。基本クラスに必要なメモリは、リリースごとに自由に変更できます。このような設計では、サイズ変更時に他のエラーが発生する可能性があります (リーク、参照できないメモリ、または別のクラスのデータへのメモリの「型変換時の初期化」)。したがって、割り当てサイズの問題を克服したとしても、オブジェクトを使用可能な状態のままにする方法で、インスタンスの部分的な割り当て解除と部分的な初期化を実行する方法を考案する必要があります。これは非常に複雑です。

于 2013-10-01T06:36:33.137 に答える
2

学問的な答えは、「はい、できます」です。より賢明な答えは次のとおりです。

私があなただったら、新しいファクトリメソッドを作成しRedGradientButtionます+(instancetype) redGradientButtonWithMyGradientButton:(MyGradientButton*)myGradientButton;

このメソッドは、新しいRedGradientButtonオブジェクトをインスタンス化し、関連するすべての の特性をコピーできますmyGradientButton。次に、それが良い考えであると思われる場合は、myGradientButtons' スーパービューを取得し、そのスーパービューから削除して、RedGradientButton代わりに新しいオブジェクトを追加することができます。もちろん、これにより、すべての参照がmyGradientButton未使用の (しかし ARC はまだ有効な) Button オブジェクトを参照するようになります。それらを更新する必要があります。

RedGradientButtonあなたは から継承すると言いますMyGradientButton。これは、使用するすべてのクラスMyGradientButtonが引き続き正常に機能することを意味します。もちろん、参照が更新された後もです。

于 2013-10-01T07:06:47.647 に答える