2009-06-28 5 views
2

良いですか? C#で一般的なVector4クラスを作成する方法はありますか? 私は、すべてが3d表現を必要とする2つのユニット(力、距離、モーメント、回転、加速、速度など)を持っており、それらはすべて非常に似たように振る舞い、したがって加算、乗算などの基本機能をサポートする必要があります。C#Generic Vector4クラスを作成していますか?

各クラスには、特殊なケースもいくつかあります。たとえば、force⨯distance= momentです。したがって、私はVector4<Force>から継承しているForce3dを作成できるようにしたいので、これらすべての矢印を常に書く必要はなく、これらのforce-specific関数を構造体に追加する必要はありません。

私はVector4からすべてのユニットが継承されている継承ベースのアプローチを使用していますが、これはいくつかの問題を引き起こします。たとえば、Add(force1、force2)を呼び出すと、ベースクラスForce3dのだから私はいずれかの鋳造またはすべてのユニットのためのAdd関数のコピーを作成することになります。

私は(好ましくは不可能だ本当のオペレーター、と)など、追加掛けるためのすべての基本的な機能を再定義することなく、Vector4<double>Vector4<Force>の両方を作成できるようにしたいです。これはまた、いくつかの新しい問題を追加します。なぜなら、Forceを2倍から継承させることですが、すべての基本型が密閉されているため、コンテナクラスを作成しなければならず、代わりにここで数値の基本演算子を再定義する必要があります。

私は可能な限りすべてのアプローチを試みてきましたが、私はいつもあまりにも多くのものを再定義してしまいます。

答えて

-1

ベースVector4<T>クラスの汎用演算子オーバーロードを作成する必要があります。 Forceクラスが独自の演算子を正しくオーバーロードしている限り、ジェネリック型のオブジェクトの演算子を使用すると適切なオーバーロードが正しく解決されるため、これは問題にはなりません。

+0

理由をしてください? – Noldorin

1

演算子のオーバーロードについては、hereがあります。これは、.Net 3.5(Jon SkeetのMiscUtilライブラリを使用)を使用して行う方法を説明しています。

メソッドの結果で正しいタイプを取得するには、あなたが何かのように使用することができますダウン投票

public class Vector<T> 
{ 
    public T x { get; } 
    public T y { get; } 
} 

public class VectorWithOperators<TVector, T> : Vector<T> 
    where TVector : Vector<T>, new() 
{ 
    public TVector GetSomeResult() 
    { 
     return new TVector(); 
    } 
} 

public class Force3D : VectorWithOperators<Force3D, double> 
{ 
} 
関連する問題