2

まず第一に、私の質問に適切なタイトルを見つけるのが困難でした... 申し訳ありません。

C# .NETの問題に直面しています。一時的な例で簡単に説明します。

私は3つのクラスを持っています:

本 movie_dvd game_dvd

それぞれに、id や name などの同じ基本プロパティがあります。ただし、それらには他の異なるプロパティと異なるメソッドがあり、同じクラスであると想定できます。もちろん、親クラスの子にすることもできます。

次に、これらの各クラスの List を作成して、本、映画、およびゲームのコレクションを定義します。それらの id プロパティはもちろんリストのキーと一致し、リストに各項目を挿入するときに適切な名前 (タイトル) を付けます。

「Show Books Collection」、「Show Movies Collection」、「Show Games Collection」の 3 つのボタンを備えたメインの winForm があります。ユーザーがそれらのいずれかをクリックすると、別のウィンドウが表示され、渡されたコレクションが ListBox (またはその他) 内に表示されます。

ここに私の問題があります。

現在、各コレクション (本、映画、ゲーム) のコンテンツを表示するために、3 つの個別の (ただしほぼ同一の) WinForms を作成していますが、これは非常にやり過ぎだと思います。私が本当にやりたいことは、これらのコレクションのコンテンツを表示する単一のウィンドウを作成することです。問題は、新しい winForm のパラメーター内で book オブジェクト/クラスを渡すと、反対側では book オブジェクトであると想定されることです。

WinFormコードを何度も複製せずに、単一のWinformを使用してこれらの異なるオブジェクトのそれぞれのタイトルを表示するにはどうすればよいですか?

4

2 に答える 2

6

フォームに 3 つのクラス (ID、タイトル、レビューなど) の間で「共通のもの」が表示される場合、次の 2 つの選択肢があります。

  1. 他の各クラスが派生できるこれらの共通属性を含む基本クラスを設計し、それぞれが基本の機能をオーバーロードおよび/または変更する可能性があります。フォームは基本クラスのリストを受け入れます。

  2. 基本プロパティを定義するインターフェイスを設計し、各クラスにそれを実装させます。フォームは、インターフェイスを実装するオブジェクトのリストを受け入れます。

これらのソリューションは両方とも、ある程度将来性があります-それに応じて継承または実装する第4の種類のものを定義でき、フォームは賢明ではありません!

#2 の方がテストに適しているので気に入っています。インターフェースを実装する任意のクラスをモックアップし、それをフォームに渡してテストすることができます。既知の書籍/DVD/ゲーム データでテストする必要はありません。

私は鋳造ソリューションのファンではありません。なぜなら、それらは脆く、拡張が難しいからです。

于 2012-12-07T21:30:35.023 に答える
4

これらのオブジェクトのそれぞれが同じプロパティ (例: Title) を持つ場合は、それらのプロパティを持つ基本クラスを作成します。その後、派生クラスでより具体的なプロパティを作成できます。

public abstract class MediaBase
{
    public String Title { get; set; }
    public Int32 Id { get; set; }
}

public sealed class Book : MediaBase
{
    public String Author { get; set; }
    public Int32 Pages { get; set; }
}

public sealed class MovieDvd : MediaBase
{
    public String Director { get; set; }
    public Int32 Length { get; set; }
}

public sealed class GameDvd : MediaBase
{
    public Int32 NumberOfPlayers { get; set; }
}

または、パラメーターをオブジェクトとして渡してから、実際の型にキャストすることもできます。

if (parameter is book)
{
    book theBook = ((book)parameter);
}
else if (parameter is movie_dvd)
{
    movie_dvd movieDvd = ((movie_dvd)parameter);
}
else if (parameter is game_dvd)
{
    game_dvd gameDvd = ((game_dvd)parameter);
}
于 2012-12-07T21:25:08.313 に答える