我需要一种方法来跟踪网格中的行数和列数。如果我使用System.Point,我总是会忘记" x"是行数或列数。所以我有下面的课程。
但是我想知道是否有办法使用System.Point,使用不同的命名皮肤?换句话说,我不想要定义一般" NRows"或" NColumns" System.Point上的方法。但我确实希望能够返回一个代码将被视为" NRowsColumns"对象,但实际上编译为System.Point。访问" NRowsColumns"对象,我们使用字段" NRows"和" NColumns"而不是" x"和" y"。但在引擎盖下,它实际上编译为System.Point。
理想情况下,此定义不限于单个文件。
public class NRowsColumns
{
public int NRows {get;set;}
public int NColumns {get;set;}
public NRowsColumns(int nRows, int nColumns)
{
this.NRows = nRows;
this.NColumns = nColumns;
}
}
答案 0 :(得分:3)
不,你不能“重命名”这样的成员。如果您真的需要,可以将System.Point
称为NRowsColumns
using NRowsColumns = System.Point;
...但它仍然与System.Point
具有相同的成员。
通过撰写 NRowsColumns
来实现System.Point
会更简单:
public class NRowsColumns
{
private Point point;
public int NRows
{
get { ... } // Code using point
set { ... } // Code using point
}
...
}
说完了:
Point
与多个行和列有任何关系。为什么不只有两个整数?N
前缀是非常规的。我可能会将GridSize
称为Rows
和Columns
- 尽管通常情况下,这似乎也不必作为单独的类型。 (为什么您的网格本身不会通过Rows
和Columns
属性公开其大小?)答案 1 :(得分:1)
您可以使用conversion operators让代码可以互换地使用NRowsColumns
和Point
。
注意,这不是一个完美的解决方案。来回创建对象会产生影响,您应该进行调查。
将implicit operator
次转化添加到现有类:
public class NRowsColumns
{
public int NRows { get; set; }
public int NColumns { get; set; }
public NRowsColumns(int nRows, int nColumns)
{
this.NRows = nRows;
this.NColumns = nColumns;
}
public static implicit operator NRowsColumns(Point p)
{
return new NRowsColumns(p.X, p.Y);
}
public static implicit operator Point(NRowsColumns rowsColumns)
{
return new Point(rowsColumns.NRows, rowsColumns.NColumns);
}
}
现在你可以来回转换:
Point point1 = new Point(5, 10);
NRowsColumns nRowsColumns = point1;
Point point2 = nRowsColumns;
请记住,每次“转化”都是一个新对象。
答案 2 :(得分:0)
为什么不直接从Point继承?
public struct NRowsColumns: Point
{
public int NRows {get {return base.x;}}
public int NColumns {get {return base.y;}}
public NRowsColumns(int nRows, int nColumns)
: base(nRows, nColumns)
{
}
}