我有以下C#方法:
public Vector2 GetVectorToTile(int x, int y)
{
return new Vector2(x * TileWidth, y * TileHeight);
}
public Vector2 GetVectorToTile(Point start)
{
return GetVectorToTile(start.X, start.Y);
}
第二种方法以非常简单的方式重载第一种方法。但是,我真的不喜欢这样的“输入清理程序重载” - 我觉得不应该有一个单独的方法来转换每种可能的输入类型。
现在,如果第一个方法的输入是单个Vector2
而不是两个数字,我可以使用条件参数,如果参数是Point
而不是Vector2
,它应该首先从Point
转换为Vector2
,然后照常进行。
但事实并非如此。
所以我的问题是,我如何告诉方法接受“两个整数或单个点”,然后在计算结果之前将后者转换为前者?
我可以在Matlab中以一种人为的方式做到这一点,但它看起来与C#完全无关:
function result = VectorToTile(varargin)
x = 0;
y = 0;
if size(varargin{1}) == [1, 1]
disp('Assuming Vector input!');
x = varargin{1}{1}.x; % Assuming the "Vector2" equivalent is a struct with .x and .y
y = varargin{1}{1}.y;
else
disp('Assuming integer pair input!');
x = varargin{1}{1};
y = varargin{1}{2};
end
result.x = x * 32; % An example value for TileWidth
result.y = y * 32; % An example value for TileHeight
end
这将适用于以下两个输入:
ints{1} = 25;
ints{2} = 125;
VectorToTile(ints);
vect{1}.x = 25;
vect{1}.y = 125;
VectorToTile(vect);
它说明了我想要做的事情,但遗憾的是C#中并没有真正的varargin
,也没有将所有内容视为矩阵。
答案 0 :(得分:6)
我不想显得轻浮但是:
像这样:所以我的问题是,我如何告诉方法接受“两个整数或单个点”,然后在计算结果之前将后者转换为前者?
public Vector2 GetVectorToTile(int x, int y)
{
return new Vector2(x * TileWidth, y * TileHeight);
}
public Vector2 GetVectorToTile(Point start)
{
return GetVectorToTile(start.X, start.Y);
}
不是您发布的代码正是您想要的吗?并且比你发布的matlab示例更清晰,更安全的方式..(恕我直言)
答案 1 :(得分:2)
你可以:
public Vector2 GetVectorToTile(int? x = null, int? y = null, Point? start = null)
{
Vector2 vector = null;
if (x.HasValue && y.HasValue)
{
vector = new Vector2(x * TileWidth, y * TileHeight);
}
else if(start.HasValue)
{
vector = new Vector2(start.X * TileWidth, start.Y * TileHeight);
}
return vector;
}
但是与Sam Holder一致,我认为你在C#做的很好。上面看起来很混乱,可能比你的方法更容易出错。例如,如果你提供了所有3个参数,哪个优先?等
答案 2 :(得分:1)
您可以使用参数数组params
关键字传入对象数组。
e.g:
public Vector2 GetVectorToTile(params object[] args)
然后你可以检查阵列中有多少并相应地处理。
但是肯定强类型参数更好吗?