3

私はこのC#クラス構造を持っており、最高のコーディング標準を使用するようにリファクタリングしたいと思います(インターフェイス/抽象クラスを使用)。これにより、保守と再利用が容易になります。現在のコードはひどいものではありませんが、理想的ではありません。

一連のTableItemGroupクラスがあります:AccountTableItemGroup、PendingVoteTableItemGroup、およびRequestingVoteTableItemGroup。各TableItemGrupには、文字列SectionNameと、対応するTableItemのリストが含まれています...

public class AccountTableItemGroup {
    public string SectionName { get; set; }

    public List<AccountTableItem> Items
    {
        get { return this._items; }
        set { this._items = value; }
    }        
    public List<AccountTableItem> _items = new List<AccountTableItem>();

    public AccountTableItemGroup()
    {
    }
}

将来的にはさらに多くのTableItemGroupがあり、List部分を除いてすべて同じである場合、コードをコピーして毎回新しいグループを作成し、その小さな変更を加える必要はありません。もっと良い方法があるに違いないことを私は知っています。List <>ジェネリックを使い続けたいので、後で何もキャストする必要はありません。

他の部分はTableItemsです。AccountTableItem、PendingVoteTableItem、およびRequestingVoteTableItemがあります。TableItemsは互いに異なりますが、それぞれ3つの共通の文字列(TitleLabel、DetailLabel、およびImageName)を共有します。ただし、その後、各TableItemには、追加のプロパティまたはメソッドが含まれる場合と含まれない場合があります。

public class AccountTableItem
{
    public string TitleLabel { get; set; }

    public string DetailLabel { get; set; }

    public string ImageName { get; set; }

    public bool SwitchSetting { get; set; }

    public AccountTableItem()
    {
    }
}

それで、皆さんへの私の質問は、コードの可能な限り多くの再利用を可能にし、最高のコーディング標準を使用するために、クラス構造を再定義するにはどうすればよいですか?

抽象TableItemクラスを作成することを考えていましたか、それともTableItemGroupのインターフェイスを使用することを考えていましたか?インターフェイスまたは抽象クラスを使用することがコーディング標準に最適であることは知っていますが、それによってコードの量がどのように削減されるかわかりません。

助けてくれてありがとう。

4

3 に答える 3

6

インターフェイスまたは基本クラスに必要なフィールドを追加して、テーブル項目を抽象化します。

    interface ITableItem // or just a simple or abstract class
    {
        // common fields go here
    }

次に、ジェネリックパラメーターに制約を付けてアイテムグループをジェネリックにすることができます。

    public class ItemGroup<T> where T: ITableItem
    {
        public string SectionName { get; set; }

        public List<T> Items { get; private set; }

        public ItemGroup()
        {
            Items = new List<T>();
        }
    }
于 2011-07-29T13:33:39.060 に答える
3

ジェネリックを使用してコンテナーを表すことを検討し、特定のタイプのテーブル アイテムを継承できるTableItemGroupの基本クラスを作成します。TableItemから直接継承すると、既存のデザインのようにプロパティList<T>を使用しなくても、アイテム グループをコレクションとして扱うことができます。Items

このような種類のインターフェイスを使用する意味はあまりありません。現状では、それらはデータ クラスであるため、動作はありません。それらに動作がある場合、実装を変更して動作を変えることができるため、インターフェイスを使用することは理にかなっています。

public class TableItemGroup<T> : List<T> where T : TableItem
{
    public TableItemGroup(string sectionName)
    {
        SectionName = sectionName;
    }

    public string SectionName { get; private set; }
}

public class TableItem
{
    public string TitleLabel { get; set; }

    public string DetailLabel { get; set; }

    public string ImageName { get; set; }
}

public class AccountTableItem : TableItem
{
    public bool SwitchSetting { get; set; }
}

汎用TableItemGroupコンテナーができたので、これをすべての型に再利用できTableItemます。再び基本クラスを持つことで、TableItem再利用が可能になります。

var items = new TableItemGroup<AccountTableItem>("Accounts");

items.Add(new AccountTableItem { SwitchSetting = true });
于 2011-07-29T13:34:00.603 に答える
1

ユーザーが自由に新しいリストを追加および削除できるようにする場合を除き、項目リストのセッターを保護する必要があります。ユーザーは引き続きアイテムを追加および削除できますが、新しいリストへの参照を作成することはできません。

于 2011-07-29T13:34:08.000 に答える