用于删除重载的条件可选参数

本文关键字:参数 条件 删除 重载 用于 | 更新日期: 2023-09-27 18:24:14

我有以下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,也没有将所有内容都视为矩阵。

用于删除重载的条件可选参数

我不想显得轻率,但:

所以我的问题是,我如何告诉这个方法接受"两个整数或一个单点",然后在计算结果之前将后者转换为前者?

像这样:

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示例更干净、更安全的方式。。(IMHO)

可以

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个参数,哪一个优先?等等

可以使用参数数组params关键字传入对象数组。

例如:

public Vector2 GetVectorToTile(params object[] args)

然后,您可以检查数组中有多少个,并进行相应的处理

但强类型参数肯定更好吗?