2016-10-05 9 views
0

C++/CLI:ポイント

public interface class ITest{ 
    public: 
      virtual void doSomething(){ 
      } 
} 

public ref Base { 
     ........... 
     ........... 
} 

generic <typename T> where T : ITest 
public ref Derived : Base{ 
    public: 
      virtual void doNothing(){ 
      } 
} 

public ref AnotherClass { 
public: 
     generic<class T> where T : Base 
    static int justDoThis(){ 
       //Problem!! 
     } 
} 

のC#:

は、C#では、二つのクラスABがあります。 AITestを継承し、BDerivedを継承します。Aが型名として使用されます。また、Bには、Aのプライベート変数があります。したがって、メイン関数AnotherClass.justDoThis<B>()からは、Bがジェネリック型として渡されます。

"//問題!!"パート:

このセクションでは、Bという新しいインスタンスを作成し、Bのプライベート変数であるAにアクセスする必要があります。私はC#のコードの記述のあなたのパラグラフを取る場合

答えて

1

だから:

public ref AnotherClass { 
public: 
    generic<class T> where T : Base 
    static int justDoThis() 
    { 
     // Problem!! 
     Something^ actuallyB = gcnew Something(); 
     A^ a = actuallyB->someVariableOfTypeA; 
    } 
} 

問題#1:あなたが作成を許可することができ

class A : ITest {} 

class B : Derived<A> 
{ 
    private A someVariableOfTypeA; 
} 

class Program 
{ 
    void Main(string[] args) 
    { 
     AnotherClass.justDoThis<B>(); 
    } 
} 

そして問題あなたはこれをしたいということです別の一般的な制約としてgcnewを指定することによって、ジェネリック型の新しいオブジェクトを追加できます。 (C#では、これはnewとなります)。これには、ジェネリック型にデフォルトの(つまりパラメータなしの)コンストラクタが必要で、通常のgcnewでアクセスできます。

generic<class T> where T : Base, gcnew 
static int justDoThis() 
{ 
    T^ t = gcnew T(); 
} 

問題#2:オブジェクト内のプライベート変数にアクセスすることはできません。それはプライベートが意味するものです。 AオブジェクトにjustDoThisアクセス権を付与する場合は、Baseに適切なパブリックメソッドまたはプロパティを追加します。メソッドまたはプロパティは、ITest型を返します。また、そのメソッド/プロパティを新しいインターフェイス(おそらくIHaveAnITestAccessorMethodという名前)に置き、それを別の汎用制約として追加し、Bがすべての制約を満たしているとします。それはタイプBに変数公衆を作るために何か良いをしないということ

注:justDoThisBを知らない、それはたった約Tを知って、パラメータなしのコンストラクタを持つBaseです。

免責事項:

  • 私はコンパイラで私の構文をチェックしませんでした。
  • はい、反射で何かできますが、それは悪い設計です。あなたのコードを正しい方法で修正しないでください。
+0

こんにちは、私はC++/CLIの初心者です。ご返信ありがとうございますが、問題1はできません。ビルド中にエラーが表示されるため、gcnewを使用してジェネリック型を割り当てることはできません。私はsafe_cast (System :: Activator :: CreateInstance(TService :: typeid))を使用しています。私は今、2つのことをしたい。まず、このistanceをwhere句のない別の汎用関数に渡します。次に、別の関数の中で、ITestからAで書かれたオーバーライド機能を使用したいと思います。 – user6924365

+0

'TService'とは何ですか?あなたはあなたの質問に 'TService'を持っていません。また、投稿ごとに1つの質問をしてください。同じ投稿にさらに質問を追加しないでください。 –

+0

それはTです。申し訳ありません。私はジェネリック型の間違った名前を付けました。あなたは質問に答えてください。私は答えが必要です。 :-) – user6924365