时间:2010-07-24 21:04:55

标签: c# inheritance clone

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

如果我是正确的,那么唯一的一个小缺点是,你被迫明确提到你正在分裂的TLoot

Arrow arrow1;
/* some code initializing arrow1 */
Arrow arrow2 = arrow1.Split<Arrow>(10);

显然,arrow1Arrow,我们无法写任何其他内容(例如Arrow b = a.Split<Potion>(10);没有任何意义),但遗憾的是Arrow arrow2 = arrow1.Split(10);不会编译,因为如果没有相同类型的参数,则不能推测泛型方法的返回类型。

以下是诀窍:在Split上设置Loot扩展方法。 : - )

它的原型变为public static TLoot Split<TLoot>(this TLoot item, int quantityToTake) where TLoot : LootTLoot现在发生在位置1的参数中(即使由特殊关键字this引入:nevermind!)。调用时,第一个参数会消失,因此所有参数都会发生,就好像我们有返回类型推断一样。

您现在可以写Arrow arrow2 = arrow1.Split(10);了。它是完全合法的,返回的类型是真正的强类型Arrow(您甚至可以编写var arrow2 = arrow1.Split(10);然后检查arrow2的类型以确定。)

我承认它似乎比在这种情况下真正有用的更酷和优雅。 但我喜欢流畅的界面(方法链接),在那里,它真的成了一个巨大的进步。 比较这两个声明:

/*Given an certain among of arrows found in the treasure chamber,
  each player in the team receives a fraction of it according to his age
  and experience, but always 10 arrows at least anyway.
  Ok, ok ! I had to search before finding such an example vaguely accurate
  in the context of arrows and potions ! lol*/
foreach(Player p in Team)
   p.Arrows = Treasure.Arrows.Split<Arrow>(10).Split<Arrow>(p.Age).Split<Arrow>(p.Experience*2);

foreach(Player p in Team)
   p.Arrows = Treasure.Arrows.Split(10).Split(p.Age).Split(p.Experience*2);

好的,这里的好处仍然很差(Treasure.Arrows.Split<Arrow>(10+p.Age+p.Experience*2)同样有效并且更短!)但实际上有些情况下隐式返回类型会极大地提高可读性。