【问题标题】:Having trouble in understanding the syntax of a overloaded class constructor难以理解重载类构造函数的语法
【发布时间】:2016-11-19 10:07:55
【问题描述】:

我在理解以下代码 sn-p 中的一行时遇到问题(摘自本书:MCSD Certification Toolkit (Exam 70-483) Programming in C#)... 这里的问题集如下:

创建一个表示椭圆的 Ellipse 类。它应该将椭圆的大小和位置存储在 RectangleF 类型的 Location 属性中(在 System.Drawing 命名空间中定义)。给它两个构造函数:一个接受 RectangleF 作为参数,另一个接受 X 位置、Y 位置、宽度、 和高度作为参数。让第二个构造函数调用第一个构造函数,如果宽度或高度小于或等于0,则让构造函数抛出异常。

class Ellipse
{
    public RectangleF Location { get; set; }

    // Constructor that takes a RectangleF as a parameter.
    public Ellipse(RectangleF rect)
    {
         // Validate width and height.
        if (rect.Width <= 0)
            throw new ArgumentOutOfRangeException("width", "Ellipse width must be greater than 0.");

        if (rect.Height <= 0)
            throw new ArgumentOutOfRangeException("height", "Ellipse height must be greater than 0.");

        // Save the location.
        Location = rect;
    }

   // Constructor that takes x, y, width, and height as parameters.
   public Ellipse(float x, float y, float width, float height)
       : this(new RectangleF(x, y, width, height))
   {
   }
}

我在理解以下行时遇到问题... 谁能解释下一行的作用?请解释得详细一点!

:this(new RectangleF(x, y, width, height))

提前致谢!

【问题讨论】:

  • :this(new RectangleF(x, y, width, height)) 调用public Ellipse(RectangleF rect) 构造函数。基本上,您的椭圆要么由x, y, width and height 构造而成,要么由rectangle 构造而成。当您从x, y, width and height 构造它时,您将它们作为构造rectangle 的参数传递,该rectangle 作为参数传递给您的其他构造函数。最后,您只使用了一个构造函数——一个接受rectangle,另一个只是将您“重定向”到它(将矩形参数转换为矩形)
  • 这样你就不必重复其他构造函数的逻辑了。

标签: c# inheritance constructor


【解决方案1】:

它的作用

有问题的行使用提供给构造函数的参数创建RectangleF 的新实例。然后它使用第一个构造函数使用创建的RectanlgeF 初始化Ellipse 的实例。

为什么有用

初始化Ellipse 有很多逻辑。可以按照在第一个构造函数中完成的相同方式对其进行初始化,但这将意味着逻辑的重复——随之而来的所有坏处。这样一来,您就可以在一个地方负责初始化新的 Ellipse,但您可以通过多种方式创建这样的实例。

考虑在有RectangleF 可用且仅实现Ellipse 的第一个构造函数的地方创建Ellipse 的新实例。您必须通过调用来“解构”矩形

var ellipse = new Ellipse(myrect.X, myrect.Y, myrect.Width, myrect.Height);

有了额外的contrsutor,这更方便。

创建不同版本的构造函数(或方法)通常被称为“语法糖”,因为它可以让程序员的生活更加美好。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    让我们自己回答您的问题。它解释了很多事情,就像你从书中学到的一样,但在现实世界中,你必须自己思考。

    1. :this(new RectangleF(x, y, width, height)) 上面的行用于调用另一个构造函数,也称为构造函数。当您使用首先调用的匹配签名执行该构造函数时。这意味着您分配给该构造函数中的任何类变量的任何值都被分配,然后您的构造函数被调用。因此,在当前构造函数中,如果您想要执行在基本构造函数中无法执行的任何附加逻辑,那么您可以这样做。

    2. 代码重用是这里的主要关注点。现在为什么? 问题说如果宽度和高度小于零,那么你必须抛出异常。现在您已经为您的类创建了两个构造函数,因为您希望类的用户可以将 Ecplice 设置传递为 x、y、width、height 格式或矩形格式。

      • 这样做的一种方法是你写宽度和高度登录这两个地方都不好。
      • 第二个问题是,如果您使用第一个构造函数,那么它将值作为矩形传递,第二个作为 x,y,width,height 传递,如果您不将该值存储在单个位置,那么稍后在代码中会出现问题正在调用哪个构造函数。因为如果您调用了第一个,那么基于第二个 x,y,width,height 的所有逻辑都将不起作用,如果您调用了第二个,那么与 Rectangle 相关的逻辑将不起作用。因此,您可能必须存储额外的信息,然后调用哪个构造函数,这在这种情况下不好,因为 RectangleF 将存储相同的值。

    【讨论】:

      猜你喜欢
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 2021-02-03
      相关资源
      最近更新 更多