-1

我有一个小问题。在我的家庭作业中,我必须创建并实现在屏幕上Point class代表 a的 a。它应该在窗口的特定位置标出字符“*” 。例如,页面的宽度应为 80 像素,最大高度应为 49 像素。在assignent上也有提示,说我应该在.pointconsoleconsoleconsoleConsole.SetCursorPosition()MSDN

那么,我走了多远?好吧,我创建了一个class名为“点”,int为协调器声明了 2 个变量 x 和 y 并创建了一个构造函数。但我不确定构造函数是否应该将这两个变量作为参数,以及它应该如何处理它们。

注意:我不希望人们为此编写整个代码;这不是我学习的方式。我写在这里是为了让C#比我有更多经验的人可以帮助我引导我走向正确的道路。

4

4 回答 4

1

IMO 表示位置的类应该是不可变的值对象,因此它应该获得值语义。

我会做什么:

  • 创建一个类ConsolePoint
  • 必须private readonly int字段来存储坐标的值
  • 有两个公共属性,其 getter 返回字段的值,没有 setter
  • 有一个构造函数,它接受两个坐标,ArgumentOutOfRangeException如果它们无效则抛出,然后分配给字段。

然后实现价值平等:

  • 覆盖EqualsGetHashCode
  • 重载==!=

所有这四个应该是一致的。


但是,如果您更喜欢可变类,我会创建两个可变字段和两个属性,它们的设置器验证坐标。这很有效,因为两个坐标的验证是独立的。在这种情况下,我只使用默认构造函数。

于 2013-02-02T15:03:48.073 回答
0

有很多可能性。一种方法是编写一个构造函数,该构造函数接受两个参数,这些参数对应于您的类中x的两个字段。y然后构造函数“body”应该将第一个参数分配给x,第二个参数分配给y

请注意,如果您选择将构造函数参数命名为与字段完全相同,则标识符x指的是参数,而不是字段。在这种情况下,您将需要写入this.x以引用该字段。

于 2013-02-02T15:10:32.680 回答
0

您说您被引导到该Console.SetCursorPosition方法 - 该页面,特别是示例部分,应该对您非常有用。

就您的班级而言,如果您发布了一些代码,则提供建议会更容易。在 C# 中,有几种常见的方法可以在类的实例上设置变量:如果它们是fields ,则可以在构造函数中传递值并让构造函数进行赋值,或者如果它们是属性,则可以直接设置它们。

于 2013-02-02T14:50:58.333 回答
0

一般来说,你会跌跌撞撞地进入有时会以宗教热情讨论的领域。有些人提倡单阶段初始化过程,构造函数总是产生一个有效且可用的对象或抛出异常。第二个想法是构造函数给你一个'空白'对象,你init()稍后调用例如一个方法。构造函数给出的对象将不可用。这将被称为两阶段初始化。

我碰巧在中间地带的某个地方,但倾向于单相初始化。有时两阶段初始化有其应用,IMO 在大多数情况下没有。其他答案建议制作Point一个不可变对象,在这种情况下,您必须使用构造函数对其进行初始化。

除了使您的对象不可变之外:如果没有充分的理由不在您的构造函数中初始化它,请不要这样做。如果您不初始化构造值,则必须在初始化之前检测类的使用情况(至少我会,以防止出现错误),而不会从中受益。

对于构造函数应该做什么:检查最大值/最小值并初始化字段。如果超出范围,则抛出异常。如果你的对象是可变的,不要忘记在你的 set 方法中做同样的事情。

在这种情况下,您可能会考虑使用属性并使类像 CodesInChaos 在他的回答中描述的那样不可变。

于 2013-02-02T14:56:53.853 回答