4

2つのクラス(これはC#です)がありますが、それぞれに独自のネストされたクラスと列挙型が含まれている点が異なります。

両方を単一の抽象クラスから継承するようにリファクタリングしたいのですが、メソッドがすべてネストされたクラスタイプに緊密に結合されているため、問題が発生しています。

私の最初の計画はItemDetailsクラスを引き出すことでしたが、それは各ビューアイテムクラスに固有の列挙型であるItemTypeにリンクされています。さらに、詳細をxmlファイルにシリアル化できる必要があるため、System.Enumを型として使用することはできません。

これらのクラス内の重複をどのように減らすことができますか?

public class FirstViewItem
{
    [Serializable]
    public class ItemDetails
    {
        public ItemType Type;
        public int Width;
        public string Text;
        public int DisplayOrder;
    }

    public enum ItemType
    {
        None = 0,
        A,
        B,
        C
    }

    public FirstViewItem()
    {
        // ...
    }

    public List<ItemDetails>()
    {
        // code here ...
    }
}

public class SecondViewItem
{
    [Serializable]
    public class ItemDetails
    {
        public ItemType Type;
        public int Width;
        public string Text;
        public int DisplayOrder;
    }

    public enum ItemType
    {
        None = 0,
        X,
        Y,
        X
    }

    public SecondViewItem()
    {
        // ...
    }

    public List<ItemDetails>()
    {
        // code here ...
    }
}
4

3 に答える 3

5

渡されるアイテムタイプの列挙型に依存するジェネリッククラスを作成するとします。

public class ViewItem<T>
{
    [Serializable]
    public class ItemDetails
    {
        public T Type; // the generic type is inserted here
        public int Width;
        public string Text;
        public int DisplayOrder;
    }

    // common code that uses ItemDetails
}

次に、いくつかのアイテムタイプ:

public enum FirstItemType
{
    None = 0,
    A,
    B,
    C
}

public enum SecondItemType
{
    None = 0,
    X,
    Y,
    Z
}

次に使用法:

var firstViewItem = new ViewItem<FirstItemType>();
于 2012-04-20T13:36:31.553 に答える
2

衙門の答えは良いです。

私はこれを書き始めたので、終わります。基本クラスといくつかの継承クラスでジェネリックスを使用する例を次に示します。

public class BaseClass<T>
{
   public T NestedClass{get;set;}
}

public  class MainOne : BaseClass<MainOneType>
{
}

public class MainTwo : BaseClass<MainTwoType>
{
}

public class MainOneType
{
}

public class MainTwoType
{
}
于 2012-04-20T13:38:37.080 に答える
0

2つの異なる答えからのアイデアを使用することになったので、組み合わせた結果で答えます。

public class BaseViewItem<T> where T : struct
{
    [Serializable]
    public class ItemDetails
    {
        public T Type;
        public int Width;
        public string Text;
        public int DisplayOrder;
    }

    public FirstViewItem()
    {
        // ...
    }

    public List<ItemDetails>()
    {
        // code here ...
    }
}

public class FirstViewItem : BaseViewItem<FirstItemType>
{
    // class-specific code...
}

public class SecondViewItem : BaseViewItem<SecondItemType>
{
    // class-specific code...
}

public enum FirstItemType
{
    None = 0, A, B, C
}

public enum SecondItemType
{
    None = 0, X, Y, Z
}
于 2012-04-20T19:35:56.610 に答える