2017-06-26 10 views
0

私は客観的なcの経験がなく、目的のcで書かれたクラスをc#に翻訳しようとしています。客観Cクラスであり、私は、このキーワードに関する研究などC言語のobjective-cの__kindof

- (NSArray<__kindof NSViewController *> *)popToViewController:(__kindof NSViewController *)viewController animated:(BOOL)animated; 

「__kindof」キーワードは、ある、およびドキュメントは、それがNSViewControllerのサブクラスは、アレイ内のパラメータまたは要素として渡すことができますことを言います。だから私はC#に似たようなことがあるのだろうかと思っています。そうでない場合は、NSViewControllerのサブクラスをこのメソッドのパラメータまたはNSArrayの要素として渡すだけですか?

答えて

0

ほとんどInheritanceについては、abstractベースクラスを継承するか、Interfaceを実装することをお勧めします。次に、ベースクラスの代わりにサブクラスインスタンスを渡すことができます。以下のような

何か:

public interface INSViewController { ... } 

public class ChildNSViewController : INSViewController {... } 

//Your method definition 

public IEnumerable<INSViewController> popToViewController(INSViewController arg) {... } 

あなたは、同様のことがC#で存在する場合だから私は疑問に思って

popToViewController(new ChildNSViewController()) 
0

パラメータとして子タイプで、今、このメソッドを呼び出すことができます。

そうではありません。効果的に__kindofは省略できないかもしれないキャストを可能にします - うまくいけば、コードがテストを行い、それができないことを知っているからです。例えば

YXのサブクラスであり、あなたがタイプXの変数を持っているならば、あなたはそれがYにキャストY、あるかどうかをテストし、Yメソッドを呼び出すことができます。変数のタイプが__kindof Xの場合、キャストステップを省略できます。しかし、Objective-Cはテストステップを静的に実行することはありません。ランタイムテストを使用してエラーをキャッチします。

C#7のパターンマッチング機能が類似したソートの何かをするために使用することができ、ような何かが特定の型である場合にはその中であなたは(ifまたはswitchで)をテストすることができますし、それに名前をバインドそのタイプ - テスト後のキャストはやはり避けてください。 Objective-C機能とは異なり、テスト部分が必要です。

もしそうでなければ、NSViewControllerのサブクラスをこのメソッドのパラメータまたはNSArrayの要素として渡すだけですか?

はい。 C#コードでは、dynamicとランタイムテストに有利な場合を除き、/ is/asのObjective-Cに暗黙のキャストが必要な場合があります。

HTH