gpt4 book ai didi

c# - 你如何在 Ruby 中实现多态性?

转载 作者:可可西里 更新时间:2023-11-01 07:49:10 24 4
gpt4 key购买 nike

在 C# 中,我可以这样做:

class Program
{
static void Main(string[] args)
{
List<Animal> animals = new List<Animal>();

animals.Add(new Dog());
animals.Add(new Cat());

foreach (Animal a in animals)
{
Console.WriteLine(a.MakeNoise());
a.Sleep();
}
}
}

public class Animal
{
public virtual string MakeNoise() { return String.Empty; }
public void Sleep()
{
Console.Writeline(this.GetType().ToString() + " is sleeping.");
}
}

public class Dog : Animal
{
public override string MakeNoise()
{
return "Woof!";
}
}

public class Cat : Animal
{
public override string MakeNoise()
{
return "Meow!";
}
}

显然,输出是(稍微解释一下):

  • 狗在 sleep
  • 喵喵
  • 猫在 sleep

由于 C# 经常因其冗长的类型语法而受到 mock ,您如何处理鸭子类型语言(如 Ruby)中的多态性/虚拟方法?

最佳答案

到目前为止,所有答案对我来说都很好。我想我只是提到整个继承的事情并不是完全必要的。暂时排除“ sleep ”行为,我们可以使用 duck-typing 实现整个预期结果,并且根本不需要创建 Animal 基类。在谷歌上搜索“duck-typing”应该会得到很多解释,所以在这里我们只说“如果它像鸭子一样走路并且像鸭子一样嘎嘎……”

“休眠”行为可以通过使用混合模块来提供,例如 Array、Hash 和其他 Ruby 内置类,包括 Enumerable。我并不是说它一定更好,只是一种不同的,也许更符合 Ruby 的方式。

module Animal
def sleep
puts self.class.name + " sleeps"
end
end

class Dog
include Animal
def make_noise
puts "Woof"
end
end

class Cat
include Animal
def make_noise
puts "Meow"
end
end

你知道其余的......

关于c# - 你如何在 Ruby 中实现多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/137661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com