欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
ruby系列教材(9):Inheritance and Messages

Inheritance 相信大家已經(jīng)很熟悉了,就是繼承,從一個(gè)class里面派生出另外一個(gè)subclass,例如:

 

class KaraokeSong < Song

  def initialize(name, artist, duration, lyrics)

    super(name, artist, duration)

    @lyrics = lyrics

  end

end

 

結果是什么?我們在Song的基礎上,建立了新的類(lèi)別,KaraokeSong,在這個(gè)例子里面,它實(shí)際上是在Song里面添加了一個(gè)新的variable,以求獲得一種新的states,我們前面說(shuō)過(guò),ruby way中,可以添加方法來(lái)實(shí)現添加屬性,但是我們?yōu)槭裁床贿@么做,而使用了繼承來(lái)達到這個(gè)目的?ruby way給我們的方式是:

 

class Song

  def initialize(name,artist,duration,lyrics)

    @name=name

    @artist=artist

    @duration=duration

    @lyrics=lyrics

  end

end

 

這里注意:我們下面談到的屬性,只是意義上的屬性,不是ruby里面的屬性(attributes)

為什么不建議大家使用第2種方式?顯而易見(jiàn)的是,一類(lèi)事物,它的固有屬性是不變的,如果它的屬性都變了,也就發(fā)生了質(zhì)變,它就不在是此物了,由此我們相信,一個(gè)構造完善的類(lèi),屬性是一定的,但是就如前面我們說(shuō)的,在不同的人看來(lái),對這些屬性的操作上,有不同的方法,而方法在特定的領(lǐng)域變化將是非常劇烈,我們不可能在構造類(lèi)的時(shí)候了解所有應該建立的方法,因為在某些領(lǐng)域,我們不可能是專(zhuān)家,我們也無(wú)法了解這么多,所以構造的類(lèi),包含的方法也是有限的,因此,當ruby涉及到一些專(zhuān)業(yè)領(lǐng)域,添加method就為我們的工作提供了極大的方便。

依然是這句話(huà):我們認為屬性的變化,使得物體發(fā)生質(zhì)變,它已經(jīng)不是我們開(kāi)始認為的那類(lèi)事物了,而第2種方式,改變屬性以后,還認為這類(lèi)物品還是以前的那類(lèi)物品。比如說(shuō),我們在車(chē)上裝了翅膀,讓車(chē)飛起來(lái),我們還能硬要說(shuō)它是車(chē)嗎?至少應該稱(chēng)之為飛車(chē)。所以,在屬性變化的時(shí)候,我們應該另構著(zhù)一個(gè)類(lèi)。使用第2種方式不僅是意義上的問(wèn)題,還會(huì )帶來(lái)副作用,我們也可以這樣看,一個(gè)類(lèi),因為某個(gè)愿意,我們?yōu)樗砑恿艘环N新的適合于某個(gè)專(zhuān)業(yè)領(lǐng)域的屬性,結果是什么?結果是:一個(gè)不熟悉某個(gè)領(lǐng)域的人,要建立這個(gè)類(lèi)的時(shí)候,使用new,這是要提供必要的parameters,由于不了解特定領(lǐng)域,而不能給出或者不能正確給出一個(gè)parameter,使得這個(gè)object都處于一種rick state,危險狀態(tài),在實(shí)際編程中,你會(huì )理解這種危險狀態(tài)。因此在這里,我們偏好使用inheritance。但是不是說(shuō)完全就不能使用方式2來(lái)override一個(gè)initialize method,以求修改它的instance variable,在某些情況下可以,比如說(shuō),設計者本身就沒(méi)有設計完善這個(gè)類(lèi),沒(méi)有包括所有普遍屬性,比如粗心的設計或者考慮不夠周全,使得car類(lèi),沒(méi)有輪子這個(gè)屬性,這是我們可以添加,當然這樣會(huì )帶來(lái)復雜和麻煩,就好像一個(gè)根基都傾斜的比薩斜塔,想要把它修正一樣的困難和危險,但是這總比使用一輛沒(méi)有輪子的車(chē)好。

 

 

方法的調用:

在ruby里面,方法被調用的時(shí)候,先在調用方法的object屬于的class里面尋找,如果沒(méi)有再在superclass里面找,一直向前。這里我們認為method屬于某個(gè)class,而不是屬于某個(gè)特定的object,最后如果都沒(méi)有找到調用的方法,發(fā)生error---NoMethodError.

 

 

為什么使用super:

1)

class Song
  def initialize(a,b,c)
    @a=a
    @b=b
    @c=c
  end
 
  def to_s
    "#@a,#@b,#@c"
  end
end

class OtherSong < Song
  def initialize(a,b,c,d)
    #super(a,b,c)
    @aa=a
    @bb=b
    @cc=c
    @d=d
  end
end

song = OtherSong.new("a","b",123,"c")
print song.to_s                                   #使用superclass的to_s方法

 

結果:

,,                           

 

2)

class Song
  def initialize(a,b,c)
    @a=a
    @b=b
    @c=c
  end
 
  def to_s
    "#@a,#@b,#@c"
  end
end

class OtherSong < Song
  def initialize(a,b,c,d)
    super(a,b,c)                            #使用super
    @d=d
  end
end

song = OtherSong.new("a","b",123,"c")
print song

 

結果:

a,b,123

 

大家應該都看見(jiàn)了結果,不使用super時(shí),如果我們對Song的內部實(shí)現不了解,結果就產(chǎn)生了錯誤,這就使得我們“要開(kāi)車(chē),必須要知道怎么制造車(chē)”,這個(gè)比喻不一定十分合理。但是上面的例子已經(jīng)告訴我們一個(gè)事實(shí),我們必須捅破superclass的實(shí)現,以求的subclass的正確實(shí)現,這無(wú)疑增加了復雜度,為了建立一個(gè)類(lèi),我們要學(xué)習它的superclass。所以使用super,這使得superclass的implements被隱藏起來(lái),我們對此不需要關(guān)心,同樣的理由,我們會(huì )用在很多設計的很多方面,給出一個(gè)跟直觀(guān)的約定:“我們盡可能的使用methods,而不是使用variables來(lái)實(shí)現功能,特別時(shí)在類(lèi)的構造的時(shí)候,盡量使用superclasses的methods,而不是它的variables

 

 

super用法:

super表示的是一個(gè)method,這個(gè)method是與調用它的方法同名的在superclass里面的method,簡(jiǎn)化此句為:

super表示superclass里面與調用super的方法同名的方法

例如:

class Song
  def initialize(a,b,c)
    @a=a
    @b=b
    @c=c
  end
 
  def to_s
    "#@a,#@b,#@c"
  end
end

class OtherSong < Song
  def initialize(a,b,c,d)
    super(a,b,c)                              #調用superclass里面的initialize方法
    @d=d
  end
  def to_s
    super + "c"                              #調用superclass里面的to_s方法
  end
end

 

由此,superclass里面是什么,這個(gè)super就表示成什么樣子。比如上面,initialize在superclass里面有3個(gè)參數,那么下面的super也有3個(gè)參數,to_s沒(méi)有參數,super也沒(méi)有參數,必須一致,不然就發(fā)生錯誤(ArgumentError)。

為了更好的說(shuō)明這個(gè)問(wèn)題,我再寫(xiě)了一個(gè)例子:

class Song
  def initialize(a,b,c)
    @a=a
    @b=b
    @c=c
  end
 
  def to_s
    "#@a,#@b,#@c"
  end
end

class OtherSong < Song
  def initialize(a,b,c,d)
    super(a,b,c)
    @d=d
  end
  def to_s
    super(1) + "c"                          #使用了一個(gè)Argument
  end
end

song = OtherSong.new("a","b",123,"c")
print song

 

結果:

in `to_s‘: wrong number of arguments (1 for 0) (ArgumentError)
from a.rb:19:in `to_s‘
from a.rb:24

 

 

再論super

super提供了一個(gè)可以方便訪(fǎng)問(wèn)superclass的機制,使得我們不必刺穿method的真相(我們也不想這么做),就可以獲取superclass賦予我們的操控力。

 

 

object is An Object

所有的classes都是inheritance Objecgt class,假如我們寫(xiě)一個(gè)class,沒(méi)有制定繼承對象,那么這個(gè)class將默認繼承Object class,這樣有什么好處?好處就是我們馬上獲得了一些特殊的能力,比如說(shuō) to_s,每個(gè)object都有 to_s 方法,這個(gè)方法來(lái)源于Object,從某種意義上來(lái)說(shuō),強制的繼承于Object(不論什么類(lèi),它的祖先ancestor,都是Object,所以說(shuō)是強制繼承)這種方式提供了一種約束,拿to_s方法來(lái)說(shuō),也許每個(gè)人都有不同的方法來(lái)表示 to_s 這個(gè)方法,結果造成了混亂的命名,A喜歡用toString,B喜歡getString,這帶來(lái)了很多的不方便,使用的不方便,還有一些特殊功能的實(shí)現也不方便,這種約定,被稱(chēng)之為習慣,在ruby里面我們獲得一種習慣,就是當把對象字符串化的時(shí)候,我們用to_s,“習慣是一種力量”,陳安之這么認為過(guò),David也這么認為,所以,rails才會(huì )這么簡(jiǎn)單,易用

 

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
ruby基礎(四)
Python面向對象編程(二)
介紹一下Ruby中的對象,屬性和方法
使用 ActiveScaffold 增強 Ruby on Rails 的功能
Python學(xué)習筆記《Python核心編程》第13章 面向對象編程
Python中的面向對象編程詳解(下)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久