【问题标题】:c# field is never assigned to and will always have its default value null?c# 字段永远不会分配给并且总是将其默认值 null?
【发布时间】:2013-04-02 19:31:37
【问题描述】:

C# 继承。我正在尝试将类四边形继承到类 sqaure。我无法弄清楚这一点,我收到以下错误,我不知道这意味着什么。字段 square.p1 从未分配给并且将始终具有其默认值 null?

    using System;

    class testquadrilaterals 
    {
        static void Main() 
{
    quadrilateral obj1 = new quadrilateral(1.1, 1.2, 6.6, 2.8, 6.2, 9.9, 2.2, 7.4);
    obj1.printcoordinates();
    Console.WriteLine("\n");
    square obj2 = new square( 4.0, 0.0, 8.0, 0.0, 8.0, 4.0, 4.0, 4.0 );
    obj2.printsquare();

    Console.ReadLine();
}
    }

    class point 
    {
        private double x;
private double y;

public point(double x_coord, double y_coord)
{
    x = x_coord;
    y = y_coord;
}

public double X { get { return x; } set { x = value; } }
public double Y { get { return y; } set { y = value; } }

public override string ToString()
{
    return ("(" + X + ", " + Y + ")");
}
    }

    class quadrilateral
    {
point p1, p2, p3, p4;

public quadrilateral(double x1, double y1, double x2, double y2,
    double x3, double y3, double x4, double y4)
{
    p1 = new point(x1, y1);
    p2 = new point(x2, y2);
    p3 = new point(x3, y3);
    p4 = new point(x4, y4);
}

public point P1 { get { return p1; } set { p1 = value; } }
public point P2 { get { return p2; } set { p2 = value; } }
public point P3 { get { return p3; } set { p3 = value; } }
public point P4 { get { return p4; } set { p4 = value; } }

public void printcoordinates()
{
    Console.WriteLine("Coordinates of Quadrilateral: \n" + p1.ToString() + " " + p2.ToString() + " " + p3.ToString() + " " + p4.ToString() + " ");
}
    }


    class square : quadrilateral
    {
point p1, p2, p3, p4;

public square(double x1, double y1, double x2, double y2,
    double x3, double y3, double x4, double y4) : base (x1, y1, x2, y2, x3, y3, x4, y4)
{ }

public void printsquare()
{
    Console.WriteLine("Coordinates of Square: \n" + p1.ToString() + " " + p2.ToString() + " " + p3.ToString() + " " + p4.ToString() + " ");
    Console.WriteLine("Area: " + area());
   // Console.WriteLine("Sides: " + sides());
}

public double area() 
{

    return Math.Abs(p1.X - p2.X) * Math.Abs(p1.Y - p3.Y); 
}
// public double sides() { }

}

【问题讨论】:

    标签: c# class inheritance compiler-errors


    【解决方案1】:

    在这种情况下,square 类定义了 4 个它从不设置的字段:p1、p2、p3 和 p4

    class square : quadrilateral {
      point p1, p2, p3, p4;
    
      ...
    }
    

    这些字段是私有的,从不设置,因此它们本质上是无用的。 C# 编译器会提醒您注意这一点,因为这通常表示存在错误。

    在这种情况下,您似乎打算让square 简单地使用quadrilateral 中的值。字段具有相同的名称和类型,并且两种类型之间存在继承关系。如果是这种情况,您应该删除square 中的字段并将quadrilateral 中的可访问性更改为protected

    class quadrilateral {
      protected  point p1, p2, p3, p4;
      ...
    }
    

    这将允许square 访问这些值

    【讨论】:

      【解决方案2】:

      如果你是从四边形继承的,你不需要在正方形中再次定义变量 p1/p2/p3/p4,你将从基类继承它们。

      【讨论】:

        【解决方案3】:

        在 Square::area() 中,p1s 和 p2s 是指在 square 类中定义的那些,而不是在 quadrilateral 类中定义的那些。您同时拥有 square::p1、square::p2 等和四边形 ::p1、quadrilateral::p2 等。正方形 p1s 和 p2s 永远不会分配给。要让您的 square 类使用四边形类的 p1s 和 p2s,请不要在 square 中重新定义它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多