【问题标题】:Inheritance in C# is not working [closed]C# 中的继承不起作用[关闭]
【发布时间】:2015-11-11 14:56:39
【问题描述】:

我已经开始学习 C#,但现在我有点困惑,因为我有一些问题。 我正在尝试将一个类继承到另一个类,但它不起作用。它说类似“你没有正确的参数” 所以,有代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication15 // Base class
{
    public class cakes
    {
        public int cakes_for;

        public cakes(int number) // constructor
        {
            cakes_for = number;
        }
        public int cakes_get // get value
        {
            get
            {
                return cakes_for;
            }   
            set
            {
                cakes_for = value;
            }
        }
        public static int cakes_plus_number(int n) // number plus constant
        {
            return n + 42;
        }
    }
    }


namespace ConsoleApplication15 // Derived Class
{
    public class Class2 : cakes // inheritance test
    {
        public int cakeses;
        public int Size { get; set; }
    }
}

【问题讨论】:

  • 你的基类有一个带参数的构造函数。您的子类没有实现它。
  • 您需要向您的派生类添加一个构造函数,如果您对实际的编译器错误进行了一些研究,就会发现这个构造函数。如Base Class Doesn't Contain Parameterless Constructor?

标签: c#


【解决方案1】:

cakes 类没有无参数构造函数,因此任何派生类型都必须显式调用基类的构造函数之一。 Class2 需要使用number 的值调用构造函数cakes(int number),因为没有它就无法实例化基类cakes。 您可以在派生类的构造函数签名后通过语法: base() 访问基类构造函数。 示例:

public class Class2 : cakes
{
    public Class2(int number) : base(number) { }
    public int cakeses;
    public int Size { get; set; }
}

示例 2:

public class Class3 : cakes
{
    public Class3() : base(8) { }
}

【讨论】:

    【解决方案2】:

    你应该像这样向你的派生类添加一个构造函数:

    public class Class2 : cakes // inheritance test
    {
        public Class2(int number) : base(number)
        {}
        public int cakeses;
        public int Size { get; set; }
    }
    

    需要注意的几点:

    • 你用 cmets 标记的类实际上是命名空间,不是一回事。

    • 我建议您查看 Capitalization styles 以及在您的示例中到处都是。

    【讨论】:

      【解决方案3】:

      我稍微修改了您的代码。我还展示了如何在 Form1() 构造函数中实例化和使用它。当然,这不是将其放入最终版本的正确位置,但它应该编译并执行以让您了解该过程。

      namespace WindowsFormsApplication1
      {
      public partial class Form1 : Form
      {
          public Form1()
          {
              InitializeComponent();
              cake2 test = new cake2();
              test.cakes = 2; //inheritance
              test.CakeSize= 50; //not inheritance
              MessageBox.Show(test.cakes.ToString() + " | " + test.CakeSize.ToString());
          }
      }
      
      public class cake
      {
          private int _cakes;
          public int cakes // get value
          {
              get
              {
                  return _cakes;
              }
              set
              {
                  _cakes = value;
              }
          }
          public cake()
          {
              public cake() : this(0) { } //constructor chaining.  Call your original function if no value is passed in
          }
          public cake(int number) // constructor
          {
              _cakes = number;
          }
      
          public static int cakes_plus_number(int n) // number plus constant //I don't see the need for static here, but whatever.
          {
              return n + 42;
          }
      }
      
      public class cake2 : cake
      {
          private int _cake2;
      
          public int cakes2
          {
              get { return _cake2; }
              set { _cake2 = value; }
          }
          private int _size;
      
          public int CakeSize
          {
              get { return _size; }
              set { _size = value; }
          }
      
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-01
        • 2017-08-20
        • 2016-12-12
        • 1970-01-01
        相关资源
        最近更新 更多