ruby的繼承到底可以繼承哪些東西

2021-09-01 09:37:10 字數 2813 閱讀 4019

1.先看私有方法能否被繼承

class a

@@name="anleb"

def ask

puts @@name

endprivate :ask

enda=a.new

#a.ask

a.send(:ask)

class b < a

endb=b.new

#b.ask

b.send(:ask)

結論:對於private方法,是被繼承的,類變數(類似於靜態變數,屬於所有例項),也是可以被繼承的。

2.看類的方法能否被繼承

題外話:private影響誰?

class a

private

def self.ask

puts "class method1"

endclass << self

def play

puts "class method2"

endend

def tell

puts "instance methods"

endend

a.ask

a.send(:ask)

a.play

a.send(:play)

a=a.new

#a.tell

a.send(:tell)

結論:可以看到private只影響例項方法,對類的方法沒有影響,要想設定類的private方法,必須在類的單件類中設定。如下:

class << self

private

def play

puts "class method2"

endend

進入正題,類的方法是否能繼承

class a

private

def self.ask

puts "class method1"

endclass << self

private

def play

puts "class method2"

endend

def tell

puts "instance methods"

endend

class b < a

endb.ask

b.send(:play)

結論:類的方法也是能繼承的,如果看過元程式設計應該知道b的祖先鏈:b-a-a的單件類-object-kernel-baseobject

3.類本身的例項變數是否能繼承

class a

@name="anleb"

class << self

attr_accessor :name

endend

p a.name

class b < a

endp b.name

輸出:anleb

nil

結論:說明類的例項變數是不繼承的,注意,這裡要區別於 類的物件的例項變數。

根據元程式設計的思路,就是:

物件包含:

物件對類的引用(指標)

物件的例項變數

物件的object_id

物件的狀態tainted和frozen狀態

類包含:

例項的方法

類變數因為物件的例項變數是存在於物件中的,所有其他的物件無法從類中獲得這個例項變數。

4.super

class a

attr_accessor :ob_name

def initialize

@ob_name="anleb"

endend

p a.new.ob_name

class b < a

attr_accessor :ob_id

def initialize

@ob_id=1

endend

p b.new.ob_name

輸出:anleb

nil #這裡是nil,是因為繼承了attr_accessor生成的魔法方法

說明:這裡不要誤解了,都說是覆蓋了父類a的initialize方法,其實不是的,因為物件呼叫方法的模式是:先向右-找到自己的類,然後再向上查詢自己的祖先類。

這裡沒有呼叫父類a的初始化方法,是因為,先找到了自己類b的初始化方法。

如果也繼承父類的同名方法呢?利用super

class a

attr_accessor :ob_name

def initialize

@ob_name="anleb"

enddef ask

puts "a methods"

endend

p a.new.ob_name

class b < a

attr_accessor :ob_id

def initialize

@ob_id=1

super

enddef ask

puts "b methods"

super

endend

p b.new.ob_name

b.new.ask

輸出:"anleb"

"anleb"

b methods

a methods

類的繼承大致就這樣,水平有限,有錯誤大家指正。

CSS中哪些元素可以繼承,哪些不可以繼承

一 無繼承性的屬性 1 display 規定元素應該生成的框的型別 2 文字屬性 vertical align 垂直文字對齊 text decoration 規定新增到文字的裝飾 text shadow 文字陰影效果 white space 空白符的處理 unicode bidi 設定文字的方向 3...

繼承父類到底繼承了哪些東西

繼承父類應該是有這幾個地方繼承了 1.原型prototype上的方法和屬性 2.類上的那些操作,類上的屬性,類上的方法,不過我覺得這屬於私有屬性和方法了,我覺得原型prototype上的才是公共的方法和屬性 如圖可以看到,無論es5還是6,都是如此,es6中,通過extends繼承原型上的方法和屬性...

css有哪些屬性可以繼承

1 字型系列屬性 font 組合字型 font family 規定元素的字型系列 font weight 設定字型的粗細 font size 設定字型的尺寸 font style 定義字型的風格 font variant 設定小型大寫字母的字型顯示文字,這意味著所有的小寫字母均會被轉換為 大寫,但是...