我有点问题。在我的家庭作业中,我必须在Point
屏幕上创建并实施代表class
的{{1}} point
。它应该在console
窗口的特定位置标出字符“*”。例如,console
页面应为80像素宽,最大高度应为49像素。还有一个暗示,我说应该在console
中寻找Console.SetCursorPosition()
方法。
那么,我到底有多远?好吧,我创建了一个名为“point”的MSDN
,为协调器声明了2 class
个变量x和y,并创建了一个构造函数。但我不确定构造函数是否应该将这两个变量作为参数,以及它应该如何处理它们。
注意:我不希望别人给我写完整个代码;这不是我学习的方式。我写在这里,所以在int
比我更有经验的人可以帮助我指导我正确的方式。
答案 0 :(得分:1)
IMO表示一个位置的类应该是一个不可变的值对象,所以它应该得到值语义。
我要做什么:
ConsolePoint
private readonly int
个字段才能存储坐标值ArgumentOutOfRangeException
,然后分配给字段。然后实现价值平等:
Equals
和GetHashCode
==
和!=
。所有这四个都应该是一致的。
但是如果你更喜欢一个可变类,我会创建两个可变字段,以及两个安装程序验证坐标的属性。这很有效,因为两个坐标的验证是独立的。在那种情况下,我只使用默认构造函数。
答案 1 :(得分:0)
您说您被定向到Console.SetCursorPosition
方法 - 该页面,特别是示例部分,应该对您非常有用。
就您的课程而言,如果您发布了一些代码,那么提供建议会更容易。在C#中,有几种常见的方法可以在类的实例上设置变量:如果它们是fields,您可以在constructor上传递值并让构造函数执行赋值,或者如果它们是properties你可以直接设置它们。
答案 2 :(得分:0)
一般来说,你磕磕绊绊地进入有时以宗教热情讨论过的领土。有些人提倡单阶段初始化过程,其中构造函数始终生成有效且可用的对象或抛出异常。第二个想法是构造函数给你一个“空白”对象,你可以调用它稍后使用init()
方法。该对象不能像构造函数给出的那样可用。这将被称为两阶段初始化。
我碰巧在中间的某个地方,但倾向于单阶段初始化。有时两阶段初始化有它的应用程序,IMO在大多数情况下它没有。其他答案建议使Point
成为不可变对象,在这种情况下,您必须使用构造函数初始化它。
除了使对象不可变之外:如果没有充分的理由不在构造函数中初始化它,请不要这样做。如果你没有在构造中初始化值,你必须在初始化之前检测类的使用(至少我会这样做,以防止错误发生),而没有它的优势。
构造函数应该做什么:根据max / min值检查值并初始化字段。如果超出界限,则抛出异常。 如果你的对象是可变的,不要忘记在你的set方法中做同样的事情。
在这种情况下,您可以考虑使用属性并使类不可变,如CodesInChaos在其答案中描述的那样。
答案 3 :(得分:0)
有很多种可能性。一种方法是编写一个构造函数,该构造函数接收两个参数,这两个参数对应于您的类中的两个字段x
和y
。然后,构造函数“body”应将第一个参数分配给x
,将第二个参数分配给y
。
请注意,如果您选择将构造函数参数命名为与字段完全相同,则标识符x
引用参数,而不是字段。在这种情况下,您需要编写this.x
来引用该字段。