2

私は、それぞれが別のWindowsアプリケーションで使用される個別のdllを生成する2つのプロジェクトを持つソリューションを持っています。これらの各プロジェクトには、MyActionsというクラスがあり、そのようなメソッドは1つだけです。

Project1

   public class MyActions
    {
        public SomeTypeA DoJob(string str1, string str2)
        {
        }
    }

プロジェクト2

   public class MyActions
    {
        public SomeTypeB DoJob(string str1)
        {
        }
    }

これら2つのクラスの2つのリターンタイプは次のとおりです。

    public class SomeTypeA 
    {
         public string stringA { get; set; }
         public int someInt { get; set; }
    }


public class SomeTypeB 
{
     public string someStringA { get; set; }

}

これらの個々のプロジェクトの両方のクラスのメソッドDoJobには、ほぼ80%のコードが同じです。Project1は、MyActionsクラスのDoJobメソッドにProject1のみに固有の追加ビットが含まれているものです。これがひねりです。Project1は最終的に廃棄され、そのdllは使用されなくなります。コードが繰り返されないように、コードを作成する必要がないように、可能な限り最善の方法でコードを記述したいと思います。 Project1が廃止された後、Project2の不要なコードを削除するための変更。

継承を使用してDoJobメソッドをオーバーライドすることを考えていました。戻り値のタイプが異なり、入力パラメーターが異なる場合、これはどのように機能しますか?おそらく、Project1のMyActionsクラスからそのコンストラクターにパラメーターの1つをプッシュしますか?Project1にProject2のMyActionsクラスへのリンクを追加することも考えていました。しかし、それを実装し、自分自身を繰り返したり、後で予期しない問題に遭遇したりしないようにする方法についてはよくわかりません。ヒント、提案はありますか?

4

3 に答える 3

3

2 つのクラスの 2 つのメソッドのパラメーターと戻り値の型が実際に異なる場合 (およびその場合のみ)、1 つのブロックであると仮定して、行単位で同一のコードを取り出し、静的メソッドを作成します。共通コードに必要なパラメーターを渡す新しい静的クラス。

複数のブロックがある場合は、複数のメソッドを持つだけです。

元の各メソッドからこれらのメソッドを適切に呼び出します。

これらのクラス間に階層関係を作成したい場合は、それが論理的である場合にのみ行うべきであり、両方に共通の型を継承させ、その共通クラスの保護されたメソッドの上にメソッドを作成します。次に、元のメソッドから呼び出すだけです。

于 2012-11-23T15:44:25.293 に答える
1

継承についてのあなたの考えは良いものです。プロジェクト1をプロジェクト2から継承させることを検討していた行の間で読んだ質問から、それは可能性ですが、おそらく最善の解決策ではありません。これが私が提案することです。

両方のプロジェクトが拡張するMyActionsのスーパークラスを作成します。このクラスに、両方のプロジェクトで共有されているすべてのコード(メソッドの80%のコード)を移動できます。次に、各プロジェクトのMyActionの特定の実装は、必要に応じてDoJobメソッドを実装し、スーパークラスから提供されたメソッドを利用します。

プロジェクト1を廃棄すると、プロジェクト2のコードに変更を加える必要はありません。その場合、実際にはもう必要ありませんが、最終的にはスーパークラスになります。ただし、どこでも繰り返すことはありません。

私はまだjavaとC#の正確な違いに精通していないので、違いがある場合は我慢してください。これは、Javaでのコードの外観です。

abstract class AbstractMyActions {

    protected SomeType commonMethodForBothProjects() {
        ...
    }
}

public class MyActionsA extends AbstractMyActions {

     public SomeType doJob(SomeParameter ..., SomeParameter ...) {
         $this->commonMethodForBothProjects();
         // Additional steps
     }
}

あなたはその考えを理解します。

于 2012-11-23T15:48:21.433 に答える
1
public class MyActions
{
    public ISomeType DoJob(ISomeParam item)
    {
    }
}

public class SomeTypeA : ISomeType 
public class SomeTypeB : ISomeType 
于 2012-11-23T15:39:18.543 に答える