如何在另一个类中传递不同的类对象并期望它们将被类似地对待?

时间:2012-12-07 21:23:04

标签: c# winforms class parameter-passing

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

我遇到了 C#.NET 的问题。我将尝试用一个临时的例子来简化它。

我有三个班级:

书 movie_dvd game_dvd

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

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

我有一个带有3个按钮的主winForm:“Show Books Collection”,“Show Movies Collection”和“Show Games Collection”。用户可以单击其中一个,然后出现另一个窗口并在ListBox(或其他)中显示传递的集合。

现在这是我的问题。

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

如何使用单个Winform显示每个不同对象的标题而不会反复复制WinForm代码?

2 个答案:

答案 0 :(得分:6)

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

  1. 设计一个基类,其中包含每个其他类可以派生的这些公共属性,每个属性可能会重载和/或修改基础的功能。表单接受基类的列表。

  2. 设计一个定义基本属性的接口,让每个类实现它。表单接受实现该接口的对象列表。

  3. 这两种解决方案在某种程度上都是面向未来的 - 你可以定义第四种相应的继承或实施的东西,你的形式将不再明智!

    我喜欢#2更好,因为它非常适合测试 - 你可以模拟任何实现你的界面的类并将它传递给你的表单来测试它。无需使用已知书籍/ DVD /游戏数据进行测试!

    我不是铸造解决方案的粉丝,因为它们很脆弱,而且很难扩展。

答案 1 :(得分: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);
}