2

首先,很难为我的问题找到一个合适的标题......为此提前抱歉。

我面临C# .NET的问题。我将尝试通过一个临时示例来简化它。

我有三个班级:

书电影_dvd游戏_dvd

它们中的每一个都具有相同的基本属性,例如:id 和 name。然而,我们可以假设它们具有其他不同的属性和不同的方法来成为同一个类。他们当然可以成为父类的子类,以使其变得更好。

然后我创建每个类的列表来定义我的书籍、电影和游戏集合。它们的 id 属性当然与 List 的键匹配,并且当我在 List 中插入每个项目时,我给它们一个适当的名称(它们的标题)。

我有一个带有 3 个按钮的主 winForm:“显示图书收藏”、“显示电影收藏”和“显示游戏收藏”。用户可以单击其中一个,然后出现另一个窗口并在 ListBox(或其他任何内容)内显示传递的集合。

现在这是我的问题。

现在我正在创建三个独立(但几乎相同)的 WinForm 来显示每个集合(书籍、电影、游戏)的内容,我认为这太过分了。我真正想做的是创建一个窗口来显示任何这些集合的内容。问题是,如果我在新 winForm 的参数中传递一个书本对象/类,另一方面它期望是一个书本对象。

如何使用单个 Winform 来显示这些不同对象中的每一个的标题,而无需一遍又一遍地复制 WinForm 代码?

4

2 回答 2

6

如果您的表单显示 3 个类之间的“常见内容” - ID、标题、评论等 - 那么您有两种选择:

  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 回答