基于输入数据的自定义返回类型

6

我有一个方法,它接受一个接口类型并评估该类型是什么,从而需要返回与之相关的类型。但我不确定如何使返回类型对其更加灵活。我尝试了以下内容:

public static T GridPosition <T>(IReSizeableGrid gridData) {
  if (gridData is Hex) {
    var hexGrid = (HexGrid) gridData;
    return HexLibrary.WorldToHex(WorldPoint(Input.mousePosition, GroundPlane), hexGrid);
  }
  if (gridData is QuadGrid) {
    var quadGrid = (QuadGrid) gridData;
    return Grid.Get(WorldPoint(Input.mousePosition, GroundPlane), quadGrid);
  }
  throw new Exception("Wrong type passed to GridPosition: " + gridData.GetType());
}

但是我遇到了这个错误:

无法将类型Hex隐式转换为T

这样使用T是否正确?我试图理解如何正确使用它。


可能是 https://dev59.com/3Gkw5IYBdhLWcg3wkLQX 的重复问题。 - Songtham T.
1
嗯,那个链接中的答案似乎暗示这样做不是一个好主意。这是否意味着我的设计可能是错误/不好的? - WDUK
那个问题和你的不同,所以建议可能也会不同。HexQuadGrid 看起来实现了 IReSizeableGrid,是吗?如果是的话,为什么要使用泛型作为返回类型呢?你可以简单地返回 IReSizeableGrid - Racil Hilan
@RacilHilan试图避免用户在使用我的库时自己进行强制转换。我希望它可以在不让他们担心的情况下正常工作。 - WDUK
我明白了。那么使用通用函数并不一定是坏事。如果不看到它的使用方式和子函数的作用,很难判断。一般来说,建议每个函数只做一件事情。如果您想继续使用通用函数,请参考我的答案。 - Racil Hilan
2个回答

7
有时候泛型并不是正确的选择。只有在你想对两个或更多相关类型执行相同操作时才会使用泛型。在这种情况下,你正在执行完全不同的操作,因此实际上需要使用方法重载
public static Point GridPosition(HexGrid gridData)
{
    return HexLibrary.WorldToHex( WorldPoint( Input.mousePosition, GroundPlane), gridData);
}

public static Point GridPosition(QuadGrid gridData)
{
    return Grid.Get(WorldPoint(Input.mousePosition, GroundPlane), gridData);
}

您可以使用相同的代码调用其中任何一个:
var result = GridPosition(new HexGrid());
var result = GridPosition(new QuadGrid());

编译器将为您选择正确的版本。


哦,我明白了,谢谢 :) 我会研究一下重载的。似乎我的谷歌搜索走了弯路。 - WDUK

0

由于 HexQuadGrid 实现了 IReSizeableGrid 接口,因此您可以将 gridData 参数的类型也设为 T,然后将 T 限制为 IReSizeableGrid

public static T GridPosition<T>(T gridData) where T : IReSizeableGrid {
    if (gridData is Hex) {
        var hexGrid = (HexGrid) gridData;
        return (T)HexLibrary.WorldToHex(WorldPoint(Input.mousePosition, GroundPlane), hexGrid);
    }
    if (gridData is QuadGrid) {
        var quadGrid = (QuadGrid)gridData;
        return (T)Grid.Get(WorldPoint(Input.mousePosition, GroundPlane), quadGrid);
    }
    throw new Exception("Wrong type passed to GridPosition: "+gridData.GetType());
}

在调用函数时,您不需要指定类型<T>。它将从gridData参数的类型中获取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接