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

标签 c# ruby polymorphism

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

相关文章:

python - Python 中的函数多态性

Java:具有接口(interface)属性的对象的 Jackson 多态 JSON 反序列化?

c++ - 多态——基类私有(private)成员的子类共享

c# - 如何使用 Rijndael 在 iOS 中加密 c# 中的解密字符串

ruby - "python -i"相当于 Ruby

c# - 在 WPF 应用程序 c# 或 vb.net 中读取 jpg、调整大小、另存为 png

Ruby DataMapper 不保存钩子(Hook)前设置的属性

ruby-on-rails - 设置没有种子数据的数据库

c# - 协变分配不起作用

c# - Windows Phone 8 AWAIT异步JSON