在 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/