不包含构造函数

时间:2020-08-25 07:14:24

标签: c# class constructor

类型定义

using System;
    
public enum Direction { Right, Left, Forward };

class Chaharpa
{
    private int age;
    private int height;
    private int cordinates_x;
    private int cordinates_y;

    public Chaharpa(int a, int b, int x, int y)
    {
        age = a;
        height = b;
        cordinates_x = x;
        cordinates_y = y;
    }

    public Chaharpa(int c, int d)
    {
        age = c;
        height = d;
        cordinates_x = 0;
        cordinates_y = 0;
    }

    public int Age
    {
        get { return age; }
    }

    public int Height
    {
        get { return height; }
    }

    public int Cordinates_x
    {
        get { return cordinates_x; }
        set { cordinates_x = value; }
    }

    public int Cordinates_y
    {
        get { return cordinates_y; }
        set { if (value > 0) cordinates_y = value; }
    }

    public void Move(Direction direction)
    {
        if (direction == Direction.Forward)
            Cordinates_y++;
        else if (direction == Direction.Right)
            Cordinates_x++;
        else if (direction == Direction.Left)
            Cordinates_x--;
    }

    class horse : Chaharpa
    {
        public bool is_wild;

        public void Jump(int x)
        {
            x = Cordinates_y;
            Cordinates_y += 5;
        }

        public void Print()
        {
            Console.WriteLine("Horse Information: Age," + Age + ", Height: " + Height + ", Wild: " + is_wild + ", X: " + Cordinates_x + ", Y: " + Cordinates_y);
        }
    }
}

用法

class Program
{
    static void Main(string[] args)
    {
        int age, x, y, minAge = 0;
        int height;
        bool wild;

        for (int i = 0; i < 3; i++)
        {

            Console.WriteLine("Horse #" + (i + 1));

            Console.Write("Enter Age: ");
            age = int.Parse(Console.ReadLine());
            Console.Write("Enter Height: ");
            height = int.Parse(Console.ReadLine());
            Console.Write("Enter X: ");
            x = int.Parse(Console.ReadLine());
            Console.Write("Enter Y: ");
            y = int.Parse(Console.ReadLine());
            Console.Write("Is Wild: ");
            wild = bool.Parse(Console.ReadLine());

            minAge = age;
            if (minAge > age)
            {
                minAge = age;
            }
        }

        Console.WriteLine();

        horse ob = new horse();

        ob.Jump(minAge);

        ob.move();

        ob.Print();

        Console.ReadKey();
    }
}

我在Visual Studio中收到这些错误:

'Chaharpa'不包含带有0个参数的构造函数

找不到类型或名称空间名称“马”(您是否缺少using指令或程序集引用?)

找不到类型或名称空间名称“马”(您是否缺少using指令或程序集引用?)

2 个答案:

答案 0 :(得分:0)

  1. 在类Chaharpa中,您定义了两个构造函数,它们都带有参数。 创建自己的构造函数将覆盖默认构造函数。 通常,从基类继承时,您想使用用于初始化基类的参数来初始化继承类,请查看此thread

  2. horseChaharpa类中的Chaharpa类不是公共的。 将类horseChaharpa更改为public并以以下方式访问它: Chaharpa.horse ob = new Chaharpa.horse(); 是正确的方法。

以下是该代码的一些缓解措施:

using System;
using System.ComponentModel;

public enum Direction
{ Right, Left, Forward };
public class Chaharpa
{
    private int age;
    private int height;
    private int cordinates_x;
    private int cordinates_y;
    public Chaharpa()
    {
    }

    public Chaharpa(int a, int b, int x, int y)
    {
        age = a;
        height = b;
        cordinates_x = x;
        cordinates_y = y;
    }
    public Chaharpa(int c, int d)
    {
        age = c;
        height = d;
        cordinates_x = 0;
        cordinates_y = 0;
    }
    public int Age
    {
        get { return age; }
    }

    public int Height
    {
        get { return height; }
    }

    public int Cordinates_x
    {
        get { return cordinates_x; }
        set { cordinates_x = value; }
    }
    public int Cordinates_y
    {
        get { return cordinates_y; }
        set { if (value > 0) cordinates_y = value; }
    }

    public void Move(Direction direction)
    {
        if (direction == Direction.Forward)
            Cordinates_y++;
        else if (direction == Direction.Right)
            Cordinates_x++;
        else if (direction == Direction.Left)
            Cordinates_x--;
    }
    public class horse : Chaharpa
    {
        public bool is_wild;

        public void Jump(int x)
        {
            x = Cordinates_y;
            Cordinates_y += 5;        
        }

        public void move()
        {
            throw new NotImplementedException();
        }

        public void Print()
        {
            Console.WriteLine("Horse Information: Age," + Age + ", Height: " + Height + ", Wild: " + is_wild + ", X: " + Cordinates_x + ", Y: " + Cordinates_y);
        }
    }
}


class Program
{
    static void Main(string[] args)
    {
        int age, x, y, minAge = 0;
        int height;
        bool wild;

        for (int i = 0; i < 3; i++)
        {

            Console.WriteLine("Horse #" + (i + 1));

            Console.Write("Enter Age: ");
            age = int.Parse(Console.ReadLine());
            Console.Write("Enter Height: ");
            height = int.Parse(Console.ReadLine());
            Console.Write("Enter X: ");
            x = int.Parse(Console.ReadLine());
            Console.Write("Enter Y: ");
            y = int.Parse(Console.ReadLine());
            Console.Write("Is Wild: ");
            wild = bool.Parse(Console.ReadLine());

            minAge = age;
            if (minAge > age)
            {
                minAge = age;
            }
        }
        Console.WriteLine();

        Chaharpa.horse ob = new Chaharpa.horse();

        ob.Jump(minAge);
                
        // You can call the Move defined in Chaharpa
        ob.Move(<PASS DIRECTION PARAMETER HERE>);

        ob.Print();

        Console.ReadKey();

    }
}

答案 1 :(得分:0)

首先,您必须研究有关C#中对象创建的更多信息。在子类构造函数中创建子类的对象时,它正在调用基类构造函数。

using System;
                    
public class Program
{
    public static void Main()
    {
        Child child = new Child();
    }
}

public class Parent{
    
    public Parent(){
        Console.WriteLine("I am parent");
    }
    
}

public class Child : Parent {
    public Child(){
        Console.WriteLine("I am child");
    }
}

输出

I am parent
I am child

创建类时,有一个默认的构造函数(该构造函数带有0个参数)。但是,当您创建另一个构造函数(接受多个参数)时,默认构造函数将替换为该构造函数。您必须手动创建默认构造函数。因此,在运行时,它试图调用基类构造函数的默认构造函数。但是既然消失了,就会发生此错误。

  • 'Chaharpa'不包含带有0个参数的构造函数

然后,您必须研究C#中的嵌套类。

您不能仅仅通过内部名称来调用内部类。您必须从外部类中引用它。

using System;
                    
public class Program
{
    public static void Main()
    {
        Outer.Inner child = new Outer.Inner();
    }
}

public class Outer{
    
    public Outer(){
        Console.WriteLine("I am outer");
    }
    
    public class Inner : Outer {
        public Inner(){
            Console.WriteLine("I am inner");
        }
    }
}

输出

I am outer
I am inner

这就是为什么出现错误The type or namespace name 'horse' could not be found (are you missing a using directive or an assembly reference?)

的原因

此代码将起作用。

using System;
public enum Direction
{ Right, Left,Forward};


 class Chaharpa
{
    private int age;
    private int height;
    private int cordinates_x;
    private int cordinates_y;
     
     public Chaharpa(){}
     
    public Chaharpa(int a, int b, int x, int y)
    {
    age = a;
    height = b;
    cordinates_x = x;
    cordinates_y = y;
    }
    public Chaharpa(int c, int d)
    {
        age = c;
        height = d;
        cordinates_x = 0;
        cordinates_y = 0;
    }
    public int Age
    {
        get{ return age; }
    }

    public int Height
    {
        get{ return height;}
    }

    public int Cordinates_x
    {
        get{ return cordinates_x;}
        set{ cordinates_x = value;}
    }
    public int Cordinates_y
    {
        get{return cordinates_y;}
        set{ if (value > 0)cordinates_y = value;}
    }

    public void Move(Direction direction)
    {
        if (direction == Direction.Forward)
            Cordinates_y++;
        else if (direction == Direction.Right)
            Cordinates_x++;
        else if (direction == Direction.Left)
            Cordinates_x--;
    }
     
     public class horse : Chaharpa
    {
        public bool is_wild;
       
        public void Jump(int x)
        {
            x = Cordinates_y;
            Cordinates_y += 5;
        }
        public void Print()
        {
            Console.WriteLine("Horse Information: Age," + Age + ", Height: " + Height + ", Wild: " + is_wild + ", X: " + Cordinates_x + ", Y: " + Cordinates_y);
        }
        
    }
}


public class Program
{
    public static void Main(string[] args)
    {
        int age, x, y, minAge = 0;
        int height;
        bool wild;
         
        for (int i = 0; i < 3; i++)
        {
            
            Console.WriteLine("Horse #" + (i + 1));
    
            Console.Write("Enter Age: ");
            age = int.Parse(Console.ReadLine());
            Console.Write("Enter Height: ");
            height = int.Parse(Console.ReadLine());
            Console.Write("Enter X: ");
            x = int.Parse(Console.ReadLine());
            Console.Write("Enter Y: ");
            y = int.Parse(Console.ReadLine());
            Console.Write("Is Wild: ");
            wild = bool.Parse(Console.ReadLine());
        
                minAge = age;
            if (minAge > age)
            {
                minAge = age;
            }
        }
        Console.WriteLine();

    Chaharpa.horse ob = new Chaharpa.horse();

    ob.Jump(minAge);
   
    ob.Print();

    }
}

对一个班级使用一个文件是一个好习惯。

相关问题