我正在尝试将一些AS3代码移植到C#(.NET),其中大部分已经完成(90%),但是在函数和函数被定义为函数方面遇到了一些问题(希望我能正确理解它)。我已经做了很多搜索,主要的事情是代表和兰博达的,然而,试图实现它们对我来说是很困难的。在布局上,有几个部分看起来是一样的,只需发布一个AS3代码的通用示例,希望能够将任何解决方案应用到其他部分。
以下是AS3代码:
static public function makeRadial(seed:int):Function {
var islandRandom:PM_PRNG = new PM_PRNG();
islandRandom.seed = seed;
var bumps:int = islandRandom.nextIntRange(1, 6);
var startAngle:Number = islandRandom.nextDoubleRange(0, 2*Math.PI);
var dipAngle:Number = islandRandom.nextDoubleRange(0, 2*Math.PI);
var dipWidth:Number = islandRandom.nextDoubleRange(0.2, 0.7);
function inside(q:Point):Boolean {
var angle:Number = Math.atan2(q.y, q.x);
var length:Number = 0.5 * (Math.max(Math.abs(q.x), Math.abs(q.y)) + q.length);
var r1:Number = 0.5 + 0.40*Math.sin(startAngle + bumps*angle + Math.cos((bumps+3)*angle));
var r2:Number = 0.7 - 0.20*Math.sin(startAngle + bumps*angle - Math.sin((bumps+2)*angle));
if (Math.abs(angle - dipAngle) < dipWidth
|| Math.abs(angle - dipAngle + 2*Math.PI) < dipWidth
|| Math.abs(angle - dipAngle - 2*Math.PI) < dipWidth) {
r1 = r2 = 0.2;
}
return (length < r1 || (length > r1*ISLAND_FACTOR && length < r2));
}
return inside;
}在AS3代码中,我不理解主函数“静态公共函数makeShape(seed:int): function”中": function“背后的推理。我确实搜索了它,但没有找到一个例子或解释,也许我没有为它键入正确的含义。
如果有人能帮我解决这个问题,给我举个例子,或者指出我需要走的更近的方向,我将非常感激。
耽误您时间,实在对不起。
发布于 2015-01-13 01:49:27
最直接的翻译是返回一个代表。在这种情况下,一般的Func委托就足够了。在C#中使用lambda表达式很容易创建这些
static public Func<Point, bool> makeShape(int seed) {
// initialization here
Func<Point, bool> inside = (Point q) => {
// some math here
return (myCondition);
}
return inside;
}尽管您可以定义自己的委托类型(如果您愿意的话):
public delegate bool ShapeTester(Point point);
static public ShapeTester makeShape(int seed) {
// initialization here
ShapeTester inside = (Point q) => {
// some math here
return (myCondition);
}
return inside;
}另一种方法(但在重构方面需要付出更多的努力)是将构成“形状”的所有逻辑封装成一个不同的类型,例如:
public class Shape
{
public Shape(int seed)
{
// initialization here
}
public bool Test(Point q)
{
// some math here
return (myCondition);
}
}然后从makeShape方法返回此类型的实例:
static public Shape makeShape(int seed) {
return new Shape(seed);
}在其他地方,您需要调用结果对象的测试方法。根据您正在开发的具体情况,如果Shape实际上是一个接口(IShape)或一个结构,您可能会做得更多。但无论如何,使用这种方法,传统的OOP设计原则(继承、多态性等)应该被跟踪。
https://stackoverflow.com/questions/27913713
复制相似问题