2011-08-17 25 views
1

ザ・マックのApp Storeのガイドラインの状態:非パブリックAPIを使用しMac App Storeではプライベートメソッドのサブクラス化が可能ですか?

アプリは、自分のクラスの中で言及されていない方法でパブリック・オブジェクトをサブクラス化などが

を拒否されます参照?

+0

これはAppleの問題ではありません。 – PengOne

+0

私はあなたのドキュメントを読んでいないと思いますか? –

+0

私はMac App Storeレビューのガイドラインを読んだことがあります。プライベートAPIについては、この質問に記載されている行だけです。 – JG566

答えて

0

Appleはこれに関して完全に一貫しているわけではありませんが、これに関していくつかのアプリを拒否しています。

+0

私はあなたの答えの通常の品質を知っているので、無礼を意味するものではありません...引用や説明はありませんか? –

+1

@Yar:違反はありません。どうしてリンクがないのか覚えていない。おそらく、私が読んだばかりのばかりの記事を追跡し、ちょうど忘れてしまったときに、それらを追加するつもりだったでしょう。私はまだぼんやりと詳細を覚えているので、私は何を見つけることができます。 – Chuck

-1

よく設計されたオブジェクトのほとんどすべてが、プライベートAPIを持っています。それがカプセル化の全体的な考え方です。

私の推測では、フレームワーククラスをサブクラス化すると、あなたのコードはそのクラスのパブリックAPIを呼び出すことしかできず、プライベートAPIを呼び出すことはあなた自身ではありません。これが当てはまらないなら、確かに誰もCocoaとCocoa-touchのフレームワークを使ってソフトウェアをリリースすることはできません。

あなたがサブクラス化し、意図的に、その後プライベートメソッドを呼び出した場合、もちろん、これは私がメソッドの結果を保存するこの

MyClass *myClass = [[MyClass alloc] init]; 
[myClass save]; 

を行う場合は、違反

この例

/* 
* This is a framework class that needs to be subclassed 
* it has one public method - (void)save; 
* and one private method - (void)doSomeWork; 
*/ 
@interface FrameWorkClass : NSObject 

- (void)save; 

@end 

@interface FrameWorkClass() 

//private 
- (void)doSomeWork; 

@end 

@implementation FrameWorkClass 

- (void)save 
{ 
    [self doSomeWork]; // Call to private method 
} 

@end 

/* 
* This is our subclass of FrameWorkClass 
*/ 
@interface MyClass : FrameWorkClass 
// more methods 
@end 

を取るだろうプライベートAPIメソッド- (void)doSomeWork;が呼び出されています。私はそれを直接フレームワーククラスと呼んでいませんでした。私はこの代わりに

MyClass *myClass = [[MyClass alloc] init]; 
[myClass doSomeWork]; 

を行っていた場合、私は辞退されるだろう直接プライベートAPIを呼び出すことになります。

+0

いいえ、それは私が意味するものではありません。 FrameWorkClassの 'doSomeWork'は' save'から呼び出されるので、サブクラス化します。 ( 'save'は私の書いたメソッドではなく、Appleのprivateメソッド' doSomeWork'を呼び出すpublicなものです) – JG566

+0

プライベートAPIをオーバーライドしたいと思っています。これはおそらく拒否の原因になります。あなたはこれを避けるために、より完全に問題を考える必要があります。@robertoが述べたように、これはとにかく信頼できないでしょう –

0

私は強くお勧めします。あなたは、Appleがあなたのアプリケーションを拒否するかどうかわからないので(戻って修正する必要があります)、またはそれらがプライベートメソッドを変更するかどうかはわかりません(将来は存在しないため、将来のOS Xのバージョンでは(これはiOSにも当てはまります)、期待していたとおりに戻って修正する必要があります)。

いずれにしても、あなたのアプリを承認するかどうかに関係なく、悪い考えです。

とにかく何をしようとしていますか?たぶん、より良い、より安全な方法があります。

+0

OPは彼が私的な方法を呼び出すことを示唆していません。サブクラスがプライベートメソッドを含む親からのすべての機能を継承するので、サブクラス化によってルールを破っているかどうかを聞いているようです。実際にプライベートメソッドを呼び出すことについてはどこに言及していないのですか。 –

+0

確かに、私は@Paulが言ったことをしようとしています。より具体的には、NSTableViewの 'allowsColumnSelection'が無効になっているとき、NSTableHeaderCellの' highlight:withFrame:inView: 'を呼び出さない。 http://parmanoir.com/Debugging_with_Activity_Monitorによると、代わりに '_drawThemeContents:highlighted:inView:'を呼び出します。 – JG566

+0

@ JG566 "使用する"とは、受け取ったメッセージを受け取るのではなく、メッセージを送信することを意味していると仮定するとかなり弁解的です。私はそれが間違いなく拒否できると思う。興味深いのは誰も楽しめるだろうと思うのは、自動アプリチェッカーがそれを検出するかどうかということだ); –

関連する問題