2

C++ のバックグラウンドを持つ私は、次のような状況に遭遇しました。

c# が typedef をサポートしていない場合、どのようにプログラムで型を関連付けますか? つまり、C++ では、関連する型を型定義として保存し、テンプレートで使用する場合に取得できます。が不足しているため、同じことを c# で同じように行うことはできませんtypedef

たとえば、C++ では次のようにします。

template< typename T >
class Thing : public ThingBase<T>
{
   public:
       bool isRelated( T::Parent & otherThing )
       {
           T::Auxillary aux( "Yes" );            
           return aux.isValid( otherThing ) && data.isParent( otherThing );
       }
   private:
       T data;
};

これは、次のいずれかで機能します。

class SomeClass
{
    public:
        typedef SomeClassParent Parent; 
        typedef FooAuxillary    Auxillary;

        bool isParent( Parent & parentObject );
};

class OtherClass
{
    public:
        typedef OtherClassParent Parent; 
        typedef BarAuxillary     Auxillary;

        bool isParent( Parent & parentObject );
};

パラメーターの型を呼び出すことT::isParentは、共通のインターフェイス インターフェイスを使用して実現できますが、型定義なしではシグネチャを構築するThing::isRelatedことは不可能に思えます。

では、C# では、T の関連するインターフェイス タイプ (C++ の例では T::Interface) を取得するにはどうすればよいでしょうか?

4

2 に答える 2

2

示されているように、一般的な制約 (およびこの場合は可能性が高い) を SLak として 2 番目の一般的なパラメーターを使用する必要があります。

interface IRelated<TRelated>
{
    bool isParent(TRelated parentObject);
}

class SomeClassParent {}
class SomeClass : IRelated<SomeClassParent>
{
    bool isParent(SomeClassParent parentObject)
    {
        // your logic here
        return true;
    }
}

class Thing<T, TParent> : ThingBase<T> where T : IRelated<TParent> {}

使用するには:

var obj = new Thing<SomeClass, SomeClassParent>();

ここに別のオプションがあります。これには実行時の型チェックが必要です (また、任意の型のオブジェクトで isParent を呼び出すことができます) が、構文がクリーンアップされます。

interface IRelated
{
    bool isParent<T>(T parentObject);
}

class SomeClassParent {}
class SomeClass : IRelated
{
    bool isParent<T>(T parentObject)
    {
        if (parentObject is SomeClassParent)
        {
            // your logic here
            return true;
        }
    }
}

class Thing<T> : ThingBase<T> where T : IRelated {}

使用するには:

var obj = new Thing<SomeClass>();
于 2013-07-19T21:50:22.123 に答える
0

共通のジェネリック インターフェイスを使用して型を関連付けます。

interface IRelatedTo<TRelated> 
class Thing<T, TRelated> where T : IRelatedTo<TRelated>
于 2013-07-19T21:26:17.550 に答える