NSStringには、+ stringWithString:という静的メソッドがあります。
もっと正確には、クラスメソッドです。
これは、ココアでNSMutableString
でオーバーライド/再宣言されていない、サブクラス再宣言する方法を必要としません。実際、それはちょうど多くのノイズ(IMO)を生成します。それはを定義するだけで、そのカスタム実装を提供するメソッドを再定義する必要があります。
これはNSMutableStringを返すとは想定できません。
は、可変文字列を返す必要があると仮定します。サブクラスは、メソッドを公に再宣言することなく必要なコントラクトを満たすために、必要に応じてイニシャライザとコンシューマコンストラクタを再定義することができます。ベースの実装が不十分な場合にのみメソッドを定義する必要があります。
これがなぜ動作してNSMutableStringを返すのか理解するために、私の知るところでは何が分かりませんか?特にベースクラスNSStringは、変更可能な文字列が必要であることを認識していないためです。
[NSString stringWithString:@"bah"]
ではなく[NSMutableString stringWithString:@"bah"]
と書かれているため、「分かっています」。インスタンスメソッドと同様に、クラスメソッドは暗黙的にself
を持ち、クラスメソッドを通して型を渡すことができます。したがって、クラスメソッドは必要に応じて再定義/オーバーライドできます。クラスメソッドは、その型を決定またはメッセージするためにself
を使用することもできます(まもなく例)。
一つは、内部で[クラスのalloc]はタイプNSMutableStringのオブジェクトを生成しますこれと呼ばれますが、でもこれは、我々はソースコードとstringWithStringを持っていないとして、純粋な推測であると言うことができる:それは内部的に欲しいものは何でも行うことができます。
これは推測ではありません。この場合、が不変の文字列を返した場合は、バグを報告する必要があります。それ以外の場合は、1つ以上の定義を使用したかどうかにかかわらず、広告として動作します。
これらのクラスメソッドはすべてサブクラスで再実装されていますか?コンビニエンスコンストラクタの場合
、それは指定された初期化子のうちの1つを介して行くことがより一般的です:例外は頻繁に行うことができるが、
@implementation NSString
+ (id)stringWithString:(NSString *)arg
{
// self is either +NSString or +NSMutableString
return [[[self alloc] initWithString:arg] autorelease];
}
:
ような実装は次の形式を取ることができます多くの場合、最適化された不変/変更可能な型の場合があります。
@implementation NSString
+ (id)stringWithString:(NSString *)arg
{
return [arg imp_isMutable] ? [[[self alloc] initWithString:arg] autorelease] : arg;
}
...
@implementation NSMutableString
+ (id)stringWithString:(NSString *)arg
{
return [[[self alloc] initWithString:arg] autorelease];
}
...
もしそうなら、これはなぜ文書化されていないのですか?
彼らは、基本クラスまたは特別なノートからいくつかの偏差を持っていない限り、唯一の違いは、あなたが要求したクラス型の場合に再宣言またはredocumentedすべきではない - その場合でも、それが良いだろう別の名前のメソッドを作成します。 NSStringので
私はあなたが私の仮定の一部( "自己"についての部分)を繰り返していると思いますが、それは矛盾した結果を返すためにすべてのクラスメソッドをサブクラスで再実装しなければならないということです。 。したがって、実装されていないので基本クラスのメソッドがNSStringを返すことは技術的に可能ですが、サブクラスが特別な機能を持つスーパークラスの完全な実装であり、バグ。ありがとう! –
@Jorisまあまあです。クラスメソッドが典型的なパターンで実装されている場合、サブクラスはクラスメソッドをオーバーライドする必要はありません。私。もし '+ stringWithString:'が 'return [[self alloc] initWithString:...] autorelease];として実装されていれば、NSMutableStringがそのメソッドをオーバーライドする必要はありません(' -initWithString : '代わりにインスタンスメソッド。 – bbum
はい、ベースクラスがどのように実装されており、一貫性を保っているか分かっていれば、明らかにそれを再実装する必要はありません。それは理にかなっている。 –