【问题标题】:Base class inheriting from another base class?基类继承自另一个基类?
【发布时间】:2016-01-13 17:21:53
【问题描述】:

我正在尝试为 C# 中的小型 Windows 游戏创建一些类。我有一个带有构造函数的类 Weapon,它继承自我的基类 Item

public class Weapon : Item
{
    public int Attack { get; set; }

    //constructor
    public Weapon(int id, string name, int value, int lvl, int attack) : 
        base(id, name, value, lvl)
    {
        Attack = attack;
    }
}

物品类:

public class Item

{
    public int ID { get; set; }
    public string Name { get; set; }
    public int Value { get; set; }
    public int Lvl { get; set; }

    //constructor
    public Item(int id, string name, int value, int lvl)
    {
        ID = id;
        Name = name;
        Value = value;
        Lvl = lvl;
    }

}

这一切都很好,我可以调用我的构造函数并创建 Weapon 对象的实例。但是,我还希望我的 Item 和 Weapon 类继承自 PictureBox 类,如下所示:

public class Item : PictureBox 

{
    public int ID { get; set; }
    public string Name { get; set; }
    public int Value { get; set; }
    public int Lvl { get; set; }

    //constructor
    public Item(int id, string name, int value, int lvl)
    {
        ID = id;
        Name = name;
        Value = value;
        Lvl = lvl;
    }

}

但是应用上面的代码会导致错误“找不到类型'MyNamespace.Item'的构造函数”

我是否以正确的方式处理这个问题?如何让我的 Item 基类从另一个基类继承?

编辑:打开类文件时错误来自VS内部:

为什么它试图在表单设计器中打开我的类文件?我不明白!

【问题讨论】:

  • 我强烈建议使用Bitmap 属性而不是覆盖PictureBox
  • 武器不能替代 PictureBox。我认为您可能应该重新考虑您的设计。
  • Picturebox 拥有我需要的所有属性。我只有一天的时间来创建它,所以只要它有效,整体设计并不重要。不过,我会看一下 Bitmap 属性。谢谢
  • 我假设你只是在这里使用图片框,所以它实际上是一个 ItemPictureBox、WeaponPictureBox 等。

标签: c# .net inheritance


【解决方案1】:

你需要一个无参数的构造函数;否则,设计器无法显示您的控件(因为您从PictureBox 派生它,它现在是一个控件,因此通过双击打开文件将加载设计器。

根据基于组件的方法,组件必须能够通过默认构造函数创建它们并通过设置公共属性(您可以在属性网格中设置)来恢复。

【讨论】:

  • 不太清楚我是否理解。你的意思是我的 Item 类需要一个无参数的构造函数吗?我希望能够通过传入属性使用构造函数创建 Item 的实例,你是说如果我从控件继承就不能这样做吗?
  • 对于Item 类及其派生类,是的。如果没有无参数构造函数,您将无法在设计器中打开它们或将它们放置在 Form 上,就像普通的 PictureBox 一样。只需检查任何控件,它们都只有一个无参数的构造函数,您可以纯粹通过它们的属性来配置它们。如果没有无参数构造函数,您将不得不创建您的 Items 并将它们放在父 FormPanel 或以编程方式。
  • 啊好吧,我明白了。我只是以编程方式处理这些对象,所以这不应该是一个问题。非常感谢。
【解决方案2】:

我相信只要基类没有标记为密封并且具有适当的构造函数,它就是正确的。创建 Item 类时,构造函数现在需要调用基本的 PictureBox 构造函数,并使用其公共构造函数之一。

例如:

//constructor
public Item(int id, string name, int value, int lvl)
: base(...params etc)
{

【讨论】:

  • 这里吹毛求疵,但如果构造函数有参数,您只需要显式调用基类。隐含无参数构造函数。
  • 我认为 PictureBox 类有一个无参数构造函数 - 我可以使用不带参数的“: base()”吗?
  • 詹姆斯在这里有正确的答案;如果它是无参数的(即图片框包含一个默认构造函数),那么你根本不需要这样做。
  • 我得到了前面提到的错误,所以一定是缺少了什么?
  • 不确定是否诚实。您需要确保在项目中引用了包含 System.Windows.Forms.PictureBox 类型的程序集。但是,编译器会告诉你...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2015-03-10
  • 2012-08-30
  • 1970-01-01
相关资源
最近更新 更多