2017-10-15 21 views
1

私はちょっと頭を抱かせることができないという問題が少しあります。Cでの一般的な処理#

私はPropertyという基本クラスを持っていますが、IntPropertyColorPropertyなどのように、そのクラスから派生したクラスがたくさんあります。さて、私はenum型のものもいくつか持っていますが、現在は別々のクラスです。私はそれをジェネリッククラスにしたいと思いますが、ここでこの問題があります:

コードの別の部分では、それらのすべてを処理する必要があります。このために仮想関数を使用することはできません(UnityEditorで何かしています)。

現在、私は、パラメータとしてPropertyを取り、その後、私はプロパティから派生するすべてのタイプのためにこれを行う機能があります。

if(property is IntProperty) 
{ 
     IntProperty intProperty = property as IntProperty; 
     intProperty.theValue = specific_int_function(); 
} 

specific_int_functionは私が持っているprividedすべての列挙型の値に対して同じであることをジェネリックからのT

理想的には私はこの(PSEUDっぽいコード)のような何かをしたいと思います:

(using T) 
{ 
    if(property is EnumProperty<T>) 
    { 
     EnumProperty<T> enumProperty = property as EnumProperty<T>; 
     enumProperty.value = (T)my_enum_value_function(typeof(T)); 
    } 
} 

私はこのすべてのコードがよりよい作ることができる方法についての任意のアイデア?

私はすべての関連情報を提供しました。

編集:

それは私がそれらのクラスで仮想関数を使用することができないほどではないのですが、私はその特定のファイル内の特定の機能のいずれかを呼び出すことはできません。私は2個のコンパイル基を有し、唯一のあなたは、クラスに関数ポインタを追加し使用することができ、それらの機能(私が話しているか知っている人のためのEditorGUI機能)

よろしく、 ロリン

+0

ハンドラに関数を渡すことはできますか? –

+0

仮想メソッドはまったく使用できませんか、または基本クラスにのみ使用できませんか?私が尋ねる理由は、私の好みのアプローチがヘルパークラスで仮想メソッドを使用するためです。 – hvd

+0

仮想クラスが別のファイルに移動できるのであれば、それは問題ありません。基本クラスや派生クラスではない。 – Sanctus2099

答えて

0

にアクセスすることができ、かつ各コンストラクタは独自の関数を実装できますか?

あなたは、このような

void specific_int_function() { 
    //Do Something 
} 
クラスのコンストラクタで

functionPTR = specific_int_function; 

そして、ジェネリッククラスの

としての機能を持っていると思いますそれぞれのクラスではプロパティに Func<void> functionPTR = null

を追加します。

void GenericHandler() { 
    functionPTR(); 
} 

私は構文については分かりませんが、これはあなたのために行っているパフォーマンスを与えるはずです。

戻り値と関数のパラメータを定義する方法については、関数ポインタを参照してください。

+0

ええ、基本クラスまたは派生クラスのいずれの 'specific_int_function'も参照できません。方法に関係なく速くなければならないので、私の問題はパフォーマンスではありません。コードをきれいにして柔軟に保つことにもっと興味があります。 – Sanctus2099

+0

specific_int_functionはどこに定義されていますか?ハンドラ関数の引数として渡すこともできます。 –

1

私はこれに仮想関数を使用できません(私はUnityEditorで何かしています)。

これは本当にすべきことです。あなたができないならば、それでいいが、私はこのメモをここに残して、他の人の利益のためにこの質問と答えも読んでいるだろう。私の経験で


それはあなたが一般的なヘルパーメソッドを使用した場合、あなたが対処しなければならない反射の複雑さのいくつかを回避することができますので、これを達成する最も困難な方法は、ヘルパークラスです。その後

abstract class EnumPropertyHelper { 
    public abstract void DoSomething(Property property); 
} 
class EnumPropertyHelper<T> : EnumPropertyHelper { 
    public override void DoSomething(Property property) { 
    EnumProperty<T> enumProperty = property as EnumProperty<T>; 
    enumProperty.value = (T)my_enum_value_function(typeof(T)); 
    } 
} 

if (property.GetType().IsGenericType 
    && property.GetType().GetGenericTypeDefinition() == typeof(EnumProperty<>)) { 
    var helperType = typeof(EnumPropertyHelper<>).MakeGenericType(property.GetType().GetGenericTypeArguments()); 
    var helper = (EnumPropertyHelper)Activator.CreateInstance(helper); 
    helper.DoSomething(property); 
} 

しかし、C#と.NETは、あなたが非で汎用コードを持ってすることはできませんので、あなたは、あなたがやって結局何これと似たフープを介してジャンプする必要があります - 一般的な方法。

関連する問題