0

別々のグリッドにデータを取り込むデータを含む2つのクラスがあります。グリッドは非常に似ていますが、2つのクラスを使用する必要があるほど異なります。両方のグリッドに「GetDuplicates」という関数が含まれており、これらのクラスを実装している場合、クラスに重複があるかどうかを確認し、重複していることを示すメッセージを返すメソッドがあります。

private bool HasDuplicates(FirstGridList firstList)
{
    var duplicates = firstList.FindDuplicates();
    if (duplicates.Count > 0)
    {
        // Do Something
        return true;
    }
    return false;
}

FirstGridListとSecondGridListの両方を使用してそのメソッドを呼び出せるようにしたいと思います。ジェネリック制約を適切に実装してから、ジェネリック入力パラメーターを正しい型にキャストする方法がわかりません。に似ている:

private bool HasDuplicates<T>(T gridList)
{
    // Somehow cast the gridList to the specific type
    // either FirstGridList or SecondGridList

    // Both FirstGridList and SecondGridList have a method FindDuplicates
    // that both return a List<string>
    var duplicates = gridList.FindDuplicates();
    if (duplicates.Count > 0)
    {
        // Do Something
        return true;
    }
    return false;
}

ご覧のとおり、このメソッドは同じことを行います。したがって、これを2回作成したくありません。これは可能だと思いますが、間違って考えています。私はまだジェネリックスの経験がありません。ありがとうございました。

4

1 に答える 1

7

両方のグリッドに、次のような共通のインターフェイスを実装させることができます。

public interface IGridList
{
    public IList<string> FindDuplicates();
}

次に、このインターフェイスに基づいて一般的な制約を定義します。

private bool HasDuplicates<T>(T gridList) where T: IGridList
{
    // Both FirstGridList and SecondGridList have a method FindDuplicates
    // that both return a List<string>
    var duplicates = gridList.FindDuplicates();
    if (duplicates.Count > 0)
    {
        // Do Something
        return true;
    }
    return false;
}

明らかに、あなたFirstGridListとあなたの両方がインターフェースとメソッドSecondGridListを実装する必要があります。IGridListFindDuplicates

または、この段階でジェネリックを取り除くこともできます。

private bool HasDuplicates(IGridList gridList)
{
    // Both FirstGridList and SecondGridList have a method FindDuplicates
    // that both return a List<string>
    var duplicates = gridList.FindDuplicates();
    if (duplicates.Count > 0)
    {
        // Do Something
        return true;
    }
    return false;
}

ちなみに、この段階ではHasDuplicates、アプリケーションにあまり価値がないため、メソッドを削除することもできます。つまり、オブジェクト指向プログラミングは、ジェネリックや LINQ などよりもずっと前に存在していたので、使用しないでください。

IGridList gridList = ... get whatever implementation you like
bool hasDuplicates = gridList.FindDuplicates().Count > 0;

基本的な C# 文化を持つすべての開発者にとって、合理的で読みやすいように思われます。もちろん、数行のコードを節約できます。また、コードを多く書くほど、間違いを犯す可能性が高くなることを忘れないでください。

于 2013-01-09T21:25:38.063 に答える