当前位置:  开发笔记 > 编程语言 > 正文

你如何在Ruby中做多态?

如何解决《你如何在Ruby中做多态?》经验,为你挑选了3个好方法。

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

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

        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!";
    }
}

显然,输出是(略有释义):

狗在睡觉

猫在睡觉

由于C#经常因其冗长的类型语法而被模拟,你如何处理像duck这样的鸭子类型语言中的多态/虚方法?



1> Mike Woodhou..:

到目前为止,所有答案对我来说都很好.我想我只是提到整个遗产并不是完全必要的.暂时排除"睡眠"行为,我们可以使用duck-typing实现整个期望的结果,并且省略了创建Animal基类的需要.谷歌搜索"鸭子打字"应该产生任何数量的解释,所以在这里,我们只是说"如果它像鸭子一样走路,像鸭子一样嘎嘎叫......"

可以通过使用mixin模块来提供"睡眠"行为,例如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

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


+1用于混合 - 使用常用功能而不是继承它.虽然这两种方法都有效,但这更像是"Ruby的做法"(对于这个特定的例子).

2> John Milliki..:

编辑:为更新的问题添加了更多代码

免责声明:我在一年左右的时间里没有使用过Ruby,也没有在这台机器上安装过Ruby,因此语法可能完全错误.但这些概念是正确的.


完全相同的方式,使用类和重写方法:

class Animal
    def MakeNoise
        return ""
    end
    def Sleep
        print self.class.name + " is sleeping.\n"
    end
end

class Dog < Animal
    def MakeNoise
        return "Woof!"
    end
end

class Cat < Animal
    def MakeNoise
        return "Meow!"
    end
end

animals = [Dog.new, Cat.new]
animals.each {|a|
    print a.MakeNoise + "\n"
    a.Sleep
}


布伦特:那将是"由Python用户记住的Ruby"

3> manveru..:

使用惯用的Ruby

class Animal
  def sleep
    puts "#{self.class} is sleeping"
  end
end

class Dog < Animal
  def make_noise
    "Woof!"
  end
end

class Cat < Animal
  def make_noise
    "Meow!"
  end
end

[Dog, Cat].each do |clazz|
  animal = clazz.new
  puts animal.make_noise
  animal.sleep
end

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有