编程C,C ++,Java,PHP,Ruby,图灵,VB
计算机科学加拿大 
编程C,C ++,Java,PHP,Ruby,图灵,VB  

用户名:   Password: 
 登记登记   

  Wiki. Wiki.     博客 博客    搜索搜索   图灵图灵   聊天室  成员成员 
 界面继承
指数 -> 编程,Ruby. -> 红宝石教程
查看上一个主题 可打印的版本下载主题利率主题订阅本主题私人信息刷新页面 查看下一个主题
作者 信息
WTD.




 邮政 发布: 2005年8月23日星期二3:38  帖子主题:界面继承

在许多面向对象的语言中,界面继承是键入系统的一个关键方面。我们可以使用接口来允许不共享有意义的公共祖先传递到相同方法的类。

例如,我们可能有嘉年华工作者和狗课程。这两个份额没有经典的继承关系。然而,两者都可以吠叫。

让我们来看看一些C#代码。

代码:
使用系统;

接口ibarker.
{
   public void Bark();
}

班级卡诺瓦尔工业: IBarker
{
   public void Bark()
   {
      Console.WriteLine("Step right up!");
   }
}

养狗: IBarker
{
   public void Bark()
   {
      Console.WriteLine("Woof!");
   }
}

公共课程测试
{
   公共静态空白主(string[] args)
   {
      Dog fido = new Dog();
     Carnival Worker Crazybobthecarnie =新的嘉年华工作台();

      Bark(fido);
      Bark(crazyBobTheCarnie);
   }

   void Bark(Ibarker Barkingobject.)
   {
      barkingObject.Bark();
   }
}


但在Ruby中,我们不会强加这种方法参数的局限性,所以没有必要,对吧?

好吧,严格来说,没有,但是知道这种关系可以很方便。那么,我们如何实现接口?

嗯,我们将使用模块。通常模块用于分区方法。最常见的例子是提供各种方便循环方法的可枚举模块。

模块中的方法确实有一个实现,而不仅仅是签名。但是,我们可以覆盖此实现以提供我们想要的功能。默认实现可以抛出有意义的错误消息。

代码:
模块巴克
   def bark
     提高Nomethoderror,"#{self.class}不实现bark方法。"     
   end
结尾

班级卡诺瓦尔工业
   include Barker
   
   def bark
      puts "Step right up!"
   end
结尾

养狗
   include Barker

   def bark
      puts "Woof!"
   end
结尾

迪瓦树皮(barking_object)
   barking_object.bark
结尾

Fido = Dog.New.
bob_the_crazy_carnie. = carnivalworker.new.

吠(fido)
吠(bob_the_crazy_carnie)


我们可以轻松地看到交互式翻译的继承关系。

代码:
IRB.(main):041:0> fido.is_a? Barker
=> true
IRB.(main):042:0>bob_the_crazy_carnie.is_a?巴克
=> true


我们也可以看到如果我们有一个包含Barker方法的类,但不会覆盖该方法。

代码:
课堂foo
   include Barker
结尾


代码:
IRB.(main):053:0> bark(Foo.new)
Nomethoderror.:Foo不实现树皮方法。
        from (irb):15:in `bark'
        from (irb):36:in `bark'
        from (irb):53
IRB.(main):054:0>
赞助
赞助
赞助
赞助
塞万提斯




 邮政 发布: 星期二8月23日8:04 AM  帖子主题:(没有主题)

谢谢wtd! 很高兴

我以为你说,虽然红宝石用混合物。
WTD写道:
红宝石 和Java仅通过混合INS和界面继承支持多重继承。

还是向后?如果没有,你也会如此友好解释一下吗? 很高兴
Rizzix.




 邮政 发布: 周8月23日,2005年12:27 PM  帖子主题:(没有主题)

世界上有什么混合??? 微笑
WTD.




 邮政 发布: 星期二8月23日,2005年1:59  帖子主题:(没有主题)

Rizzix写道:
世界上有什么混合??? 微笑


一种非常强大的编程方式。在我看来,最强大的混合,是令人令人愉快的。

基本上,使用Mix-IIN,您可以查看许多类共同的方法。到目前为止,这就像界面继承。

但是,在这种情况下,我们提供了实现。为此,我们需要弄清楚每个类的基本功能,其中包括混合In必须实现。在枚举的情况下,它是“每个”方法。

让我们看看一个令人不安的简单的例子。

代码:
IRB.(main):001:0> class Foo
IRB.(main):002:1>    def each
IRB.(main):003:2>       for x in 1..4
IRB.(main):004:3>          yield x
IRB.(main):005:3>       end
IRB.(main):006:2>    end
IRB.(main):007:1> end
=> nil
IRB.(main):008:0>
IRB.(main):009:0 * foo.new.each {| x |把x}
1
2
3
4
=> 1..4
IRB.(main):010:0> class Foo
IRB.(main):011:1>    include Enumerable
IRB.(main):012:1> end
=> Foo
IRB.(main):013:0>foo.new.colect {| x |"#{x}!" }
=> ["1!", "2!", "3!", "4!"]
IRB.(main):014:0> Foo.new.to_a
=> [1, 2, 3, 4]
IRB.(main):015:0>foo.w.select {| x | x%2 == 0}
=> [2, 4]
IRB.(main):016:0>foo.new.reject {| x | x%2 == 0}
=> [1, 3]


现在,我没有写入任何代码来收集,to_a,选择或拒绝,但无论如何我都在使用它们。 微笑
塞万提斯




 邮政 发布: 星期二8月23日,2005年3:51 PM  帖子主题:(没有主题)

我必须遗漏一些东西,因为我没有看到它的任何不同于第一篇文章中的代码。两者都有一个模块 包括d进入课程,从而允许模块中的方法集成到类中。但是顶级帖子是据说界面继承,而这一个是混合?
我在允许程序员选择一个从模块中选择哪种方法的混合。  EH.
WTD.




 邮政 发布: 星期二8月23日,2005年4:18  帖子主题:(没有主题)

第一个是一个混合,但通过使默认实现是提出异常,我们会在尝试使用包含模块的类中使用其中一个方法但不覆盖该方法的类别进行异常。 微笑
Rizzix.




 邮政 发布: 2005年8月23日星期二4:47  帖子主题:(没有主题)

如果U包含多个模块具有相同的方法名称 - ,我会看到问题 -
WTD.




 邮政 发布: 2005年8月23日星期二5:05 PM  帖子主题:(没有主题)

这是相当容易理解的。可以随时更改方法。

代码:
IRB.(main):019:0> def hello
IRB.(main):020:1>    "yo"
IRB.(main):021:1> end
=> nil
IRB.(main):022:0> hello
=> "yo"
IRB.(main):023:0> def hello
IRB.(main):024:1>    "oy"
IRB.(main):025:1> end
=> nil
IRB.(main):026:0> hello
=> "oy"
IRB.(main):027:0>


但我们可以将旧方法与“别名”保持一致。

代码:
IRB.(main):027:0> alias :old_hello :hello
=> nil
IRB.(main):028:0> def hello
IRB.(main):029:1>    "foo"
IRB.(main):030:1> end
=> nil
IRB.(main):031:0> hello
=> "foo"
IRB.(main):032:0> old_hello
=> "oy"
IRB.(main):033:0>


当然,这延伸到与模块一起使用。

代码:
$ IRB.
IRB.(main):001:0> module Foo
IRB.(main):002:1>    def baz() "Hello" end
IRB.(main):003:1> end
=> nil
IRB.(main):004:0> module Bar
IRB.(main):005:1>    def baz() puts "yo" end
IRB.(main):006:1> end
=> nil
IRB.(main):007:0> class Qux
IRB.(main):008:1>    include Foo
IRB.(main):009:1>    include Bar
IRB.(main):010:1> end
=> Qux
IRB.(main):011:0> Qux.new.baz

=> nil
IRB.(main):012:0> class Wooble
IRB.(main):013:1>    include Foo
IRB.(main):014:1>    alias :foo_baz :baz
IRB.(main):015:1>    include Bar
IRB.(main):016:1> end
=> Wooble
IRB.(main):017:0> Wooble.new.foo_baz
=> "Hello"
IRB.(main):018:0> Wooble.new.baz

=> nil
IRB.(main):019:0>
赞助
赞助
赞助
赞助
从上一个显示帖子:   
    指数 -> 编程,Ruby. -> 红宝石教程
查看上一个主题 告诉一个朋友可打印的版本下载主题利率主题订阅本主题私人信息刷新页面 查看下一个主题

11  [ 8 Posts ]
跳到:   


Style:  
搜索: