将谓词作为参数传递 c#
Passing a predicate as a parameter c#
我最近对一家公司进行了评估,该公司有一个案例,他们想要将谓词设置为方法的输入参数。对此我几乎没有经验,我一直在自己研究它。代码如下:
using System;
public interface IBird
{
Egg Lay();
}
public class Chicken : IBird
{
public Chicken()
{
}
public void EggLay()
{
}
public Egg Lay()
{
return new Egg();
}
}
public class Egg
{
public Egg(Func<IBird> createBird)
{
throw new NotImplementedException("Waiting to be implemented.");
}
public IBird Hatch()
{
throw new NotImplementedException("Waiting to be implemented.");
}
}
public class Program
{
public static void Main(string[] args)
{
// var chicken1 = new Chicken();
// var egg = chicken1.Lay();
// var childChicken = egg.Hatch();
}
}
我的问题是 Egg 函数需要什么,为什么?
我已经看过 this answer and this answer and 但它仍然没有任何意义。目前是学术性的,但我真的很想了解。
public Egg(Func<IBird> createBird)
不是一个函数,它是 constructor of the Egg
class. Since the Egg
class must Hatch
birds, it needs to create birds. Func<IBird>
is a delegate, i.e., a value representing a reference to a method. In this specific case it is representing a factory method。谓词可以是方法或委托 returning 布尔值。通过此参数,您可以传递任何创建 IBird
s 的方法。由于 IBird
接口未指定鸟的显式实现,因此您可以使用不同的方法初始化 Egg
以创建不同的鸟类型。有些需要构造函数参数,有些不需要。
你会像这样实现Egg
public class Egg
{
private readonly Func<IBird> _createBird;
public Egg(Func<IBird> createBird)
{
_createBird = createBird; // No "()". createBird is not called, just assigned.
}
public IBird Hatch()
{
return _createBird(); // Here createBird is called, therefore the "()".
}
}
现在,Hatch
方法可以通过 _createBird
委托的中介来创建鸟,而无需知道如何创建鸟或创建哪种类型的鸟。
你会如何创造一个鸡蛋?好吧,首先你需要一些 bird 实现,例如:
public class BlackBird : IBird
{
... your implementation goes here
}
然后您需要一种创建和 returning IBird
的方法。例如:
IBird CreateBlackBird()
{
return new BlackBird();
}
然后您可以用
创建一个鸡蛋
var egg = new Egg(CreateBlackBird); // No "()". CreateBlackBird is not called but referenced.
IBird newBird = egg.Hatch();
确保传递的方法没有参数列表,即没有括号,因为此时你不想调用CreateBlackBird
方法,你想把它传递给构造函数,在那里它存储在私有字段_createBird
中以备后用。
lambda 表达式即时创建匿名委托:
var egg = new Egg(() => new BlackBird());
() => new BlackBird()
是一个 lambda 表达式。它等同于 CreateBlackBird
方法。 return 类型未指定,是从 Egg
构造函数的参数类型推断的。它没有名字。方法头中只剩下参数大括号。 =>
替换 return
关键字。
在使用颜色作为构造函数参数实现了额外的鸟 class 之后,您可以编写
var egg = new Egg(() => new ColoredBird(Color.Blue));
另请参阅:
感谢这个例子。
您可以通过修改 Egg class 实现单例模式,使鸟只能孵化一次,如下所示:
public class Egg
{
private readonly Func<IBird> _createBird;
private IBird _Bird = null;
public Egg(Func<IBird> createBird)
{
_createBird = createBird;
}
public IBird Hatch()
{
if (_Bird == null)
{
_Bird = _createBird();
}
return _Bird;
}
}
您可以实现单例模式,通过如下修改蛋class,使小鸟只能孵化一次。
public interface IBird
{
Egg Lay();
}
public class Egg
{
private readonly Func<IBird> _createBird;
private bool _hatched;
public Egg(Func<IBird> createBird)
{
_createBird = createBird;
}
public IBird Hatch()
{
if (_hatched)
Console.WriteLine("Egg are already hatched");
_hatched = true;
Console.WriteLine("Egg are hatched now;");
Console.ReadKey();
return _createBird();
}
}
public class Chicken : IBird
{
public Egg Lay()
{
var egg = new Egg(() => new Chicken());
return egg;
}
}
public class Program
{
public static void Main(string[] args)
{
var chicken1 = new Chicken();
var egg = chicken1.Lay();
var childChicken = egg.Hatch();
}
}
我最近对一家公司进行了评估,该公司有一个案例,他们想要将谓词设置为方法的输入参数。对此我几乎没有经验,我一直在自己研究它。代码如下:
using System;
public interface IBird
{
Egg Lay();
}
public class Chicken : IBird
{
public Chicken()
{
}
public void EggLay()
{
}
public Egg Lay()
{
return new Egg();
}
}
public class Egg
{
public Egg(Func<IBird> createBird)
{
throw new NotImplementedException("Waiting to be implemented.");
}
public IBird Hatch()
{
throw new NotImplementedException("Waiting to be implemented.");
}
}
public class Program
{
public static void Main(string[] args)
{
// var chicken1 = new Chicken();
// var egg = chicken1.Lay();
// var childChicken = egg.Hatch();
}
}
我的问题是 Egg 函数需要什么,为什么?
我已经看过 this answer and this answer and
public Egg(Func<IBird> createBird)
不是一个函数,它是 constructor of the Egg
class. Since the Egg
class must Hatch
birds, it needs to create birds. Func<IBird>
is a delegate, i.e., a value representing a reference to a method. In this specific case it is representing a factory method。谓词可以是方法或委托 returning 布尔值。通过此参数,您可以传递任何创建 IBird
s 的方法。由于 IBird
接口未指定鸟的显式实现,因此您可以使用不同的方法初始化 Egg
以创建不同的鸟类型。有些需要构造函数参数,有些不需要。
你会像这样实现Egg
public class Egg
{
private readonly Func<IBird> _createBird;
public Egg(Func<IBird> createBird)
{
_createBird = createBird; // No "()". createBird is not called, just assigned.
}
public IBird Hatch()
{
return _createBird(); // Here createBird is called, therefore the "()".
}
}
现在,Hatch
方法可以通过 _createBird
委托的中介来创建鸟,而无需知道如何创建鸟或创建哪种类型的鸟。
你会如何创造一个鸡蛋?好吧,首先你需要一些 bird 实现,例如:
public class BlackBird : IBird
{
... your implementation goes here
}
然后您需要一种创建和 returning IBird
的方法。例如:
IBird CreateBlackBird()
{
return new BlackBird();
}
然后您可以用
创建一个鸡蛋var egg = new Egg(CreateBlackBird); // No "()". CreateBlackBird is not called but referenced.
IBird newBird = egg.Hatch();
确保传递的方法没有参数列表,即没有括号,因为此时你不想调用CreateBlackBird
方法,你想把它传递给构造函数,在那里它存储在私有字段_createBird
中以备后用。
lambda 表达式即时创建匿名委托:
var egg = new Egg(() => new BlackBird());
() => new BlackBird()
是一个 lambda 表达式。它等同于 CreateBlackBird
方法。 return 类型未指定,是从 Egg
构造函数的参数类型推断的。它没有名字。方法头中只剩下参数大括号。 =>
替换 return
关键字。
在使用颜色作为构造函数参数实现了额外的鸟 class 之后,您可以编写
var egg = new Egg(() => new ColoredBird(Color.Blue));
另请参阅:
感谢这个例子。 您可以通过修改 Egg class 实现单例模式,使鸟只能孵化一次,如下所示:
public class Egg
{
private readonly Func<IBird> _createBird;
private IBird _Bird = null;
public Egg(Func<IBird> createBird)
{
_createBird = createBird;
}
public IBird Hatch()
{
if (_Bird == null)
{
_Bird = _createBird();
}
return _Bird;
}
}
您可以实现单例模式,通过如下修改蛋class,使小鸟只能孵化一次。
public interface IBird
{
Egg Lay();
}
public class Egg
{
private readonly Func<IBird> _createBird;
private bool _hatched;
public Egg(Func<IBird> createBird)
{
_createBird = createBird;
}
public IBird Hatch()
{
if (_hatched)
Console.WriteLine("Egg are already hatched");
_hatched = true;
Console.WriteLine("Egg are hatched now;");
Console.ReadKey();
return _createBird();
}
}
public class Chicken : IBird
{
public Egg Lay()
{
var egg = new Egg(() => new Chicken());
return egg;
}
}
public class Program
{
public static void Main(string[] args)
{
var chicken1 = new Chicken();
var egg = chicken1.Lay();
var childChicken = egg.Hatch();
}
}