1

プロジェクトに一連のクラスがあり、それらはすべて基本的に同じことを行いますが、オブジェクトは異なります。それらのいくつかは別の時期に別の人によってコード化されているため、名前付けに一貫性がありません。現在のオブジェクトだけでなく、将来作成される新しいオブジェクトにも一定の一貫性が保たれるように、コードを更新したいと考えています。プログラミングを理解していると、基本クラスまたはインターフェイスのいずれかが必要であると考えるようになりますが、どちらも機能させる方法がわかりません。私がしたい方法は次のとおりです。

internal BusinessObject MethodA(EntityObject entity)
internal Void MethodB(EntityContext context, BusinessObject obj, EntityObject entity)

私が抱えている問題は、各クラスで「BusinessObject」と「EntityObject」が異なることです。たとえば、「CarObject と CarEntity」の場合と「BusObject と BusEntity」の場合があります。私はまだ 2 つのメソッドが必要であり、MethodA と MethodB という名前が必要です。実装内の実際のオブジェクト タイプを交換したいだけです。異なるオブジェクトを使用しているため、実装自体も異なります。

コンパイル時にオブジェクトの型を知っており、オブジェクトのプロパティにアクセスできる必要があるため、ジェネリックを使用する場合は、実装でジェネリックを正しい型としてキャストする必要があります。また、MethodA の実装では、「新しい」BusinessObject、つまり「BusinessObject x = new BusinessObject()」を作成する必要があります。

メソッドでジェネリックを使用したインターフェイスと、抽象メソッドを使用した基本クラスを使用してみましたが、どちらも機能させる方法を理解できませんでした。

これを処理する最善の方法は何ですか? サンプルコードは大歓迎です。

4

3 に答える 3

3

ジェネリックが道

したがって、次の行に沿ってインターフェイス (またはそのルートを好む場合は基本クラス) を宣言します。

internal interface IEntityContext<TEntity>
{
 ???
}

internal interface IMyInterfaceName<TEntity, TBusinessObject>
{
TBusinessObject MethodA(TEntity entity);
Void MethodB(IEntityContext<TEntity> context, TBusinessObject obj, TEntity entity);
}

次に、クラスの実装に関しては:

class MyClassThatDoesThisStuff : IMyInterfaceName<Farm, FarmBo>
{
    internal FarmBo MethodA(Farm entity);
    internal Void MethodB(IEntityContext<Farm> context, FarmBo obj, Farm entity);

}

等...

クラスが何かから派生するように強制することもできます。

interface IMyInterfaceName<TEntity, TBusinessObject> 
            where TEntity : EntityBase,
                  TBusinessObject : BusinessObjectBase
{
...
}
于 2011-01-27T20:59:47.070 に答える
2

抽象基本クラスを使用したソリューションを示すために、詳細については Neils answer を参照してください...

public abstract class BaseClass<A,B> {
    internal abstract A MethodA(B entity);
    internal abstract void MethodB(EntityContext context, A obj, B entity);
}

次に、このクラスを拡張します。

public class AClass : BaseClass<BusinessObject, EntityObject> {
    internal override BusinessObject MethodA(EntityObject entity) {...}
    internal override void MethodB(EntityContext ctx, BusinessObject obj, EntityObject entity) {...}
}
于 2011-01-27T21:01:28.657 に答える
1

実際には3つのアプローチがあります。

  1. ジェネリックス:BusinessObjectおよびEntityObjectのタイプに依存しない方法でコンテナーオブジェクトを指定する場合。これを少し拡張して、ジェネリックがジェネリック制約付きのパラメーターとして受け入れるオブジェクトのタイプに制限を設けることができます。大きな課題は、キャストやその他の比較的安全でない操作なしにBusinessObjectとEntityObjectを実際に使用することは難しいということです。

  2. 継承:この場合、BusinessObjectを基本クラスとして実装し、パラメーターとして使用されるすべてのオブジェクトがそこから派生することを要求します。同様に、EntityObjectも同様です。次に、実際に使用する必要のあるメソッドを基本クラスに配置できます(必要に応じて、派生クラスでそれらをオーバーライドします)。

  3. インターフェース:これは2つの中間です。ここでは、BusinessObjectとEntityObjectがインターフェイスであると言います(従来、IBusinessObjectなどのように名前はIで始まります)。ここでは、BusinessObjectまたはEntityObjectの実装に必要なメソッドをインターフェイスで指定し、その結果、コンテナでそれらを呼び出すことができます。物体。

したがって、提供する情報が限られているため、どちらが最も適切かを判断することは不可能です。ただし、これらは3つの基本的な選択です。

于 2011-01-27T21:28:22.807 に答える