2
A
回答
5
Ruby類全部開放。沒有閉門課。
實施例:
class String
def foo
puts "bar"
end
end
'anything'.foo
#bar
2
打開/封閉原則並不完全適用於紅寶石。
定義說..你的類/對象應該打開進行擴展,但關閉修改。這是什麼意思?
這意味着你不應該去修改類來添加新的行爲。您應該使用繼承或組合來實現。
E.g.
class Modem
HAYES = 1
COURRIER = 2
ERNIE = 3
end
class Hayes
attr_reader :modem_type
def initialize
@modem_type = Modem::HAYES
end
end
class Courrier
attr_reader :modem_type
def initialize
@modem_type = Modem::COURRIER
end
end
class Ernie
attr_reader :modem_type
def initialize
@modem_type = Modem::ERNIE
end
end
class ModemLogOn
def log_on(modem, phone_number, username, password)
if (modem.modem_type == Modem::HAYES)
dial_hayes(modem, phone_number, username, password)
elsif (modem.modem_type == Modem::COURRIER)
dial_courrier(modem, phone_number, username, password)
elsif (modem.modem_type == Modem::ERNIE)
dial_ernie(modem, phone_number, username, password)
end
end
def dial_hayes(modem, phone_number, username, password)
puts modem.modem_type
# implmentation
end
def dial_courrier(modem, phone_number, username, password)
puts modem.modem_type
# implmentation
end
def dial_ernie(modem, phone_number, username, password)
puts modem.modem_type
# implementation
end
end
要支持一種新型調制解調器..你必須去修改類。
使用繼承。你可以抽象出調制解調器功能。和
# Abstration
class Modem
def dial
end
def send
end
def receive
end
def hangup
end
end
class Hayes < Modem
# Implements methods
end
class Courrier < Modem
# Implements methods
end
class Ernie < Modem
# Implements methods
end
class ModelLogON
def log_on(modem, phone_number, username, password)
modem.dial(phone_number, username, password)
end
end
現在支持新型調制解調器..你不必去和修改源代碼。您可以添加新代碼以添加新類型的調制解調器。
這是如何使用繼承實現開放/關閉原則。這個原理可以用許多其他技術來實現。
相關問題
- 1. Ruby Process.daemon:打開/關閉
- 2. C#線程:如何在線程關閉後打開主窗體
- 3. C#中打開窗體並關閉它
- 4. Javascript:打開/關閉開關
- 5. 關閉MessageBox但保持窗體打開
- 6. 使用javascript在打開新窗體之前關閉所有打開的窗體
- 7. 打開/關閉Resharper
- 8. 打開/關閉WiFi
- 9. 打開主題/關閉主題/列表主題
- 10. 我想在ADF中設置主打開和關閉ShortDesc Notofication
- 11. 當關閉窗體關閉如何關閉所有打開的消息框
- 12. JQuery:打開/關閉菜單,打開但不關閉
- 13. 在Visual Basic中退出時打開和關閉窗體?
- 14. 如何在vb.net中禁用窗體打開/關閉效果?
- 15. 如何在c#.NET中打開一個關閉的窗體?
- 16. 在Twilio中打開和關閉電話
- 17. 在Javascript中打開/關閉按鈕
- 18. 在Android中打開和關閉Gps?
- 19. 在Android中打開和關閉屏幕
- 20. 在HTML中打開和關閉標記
- 21. 關閉在javascript中打開的窗口
- 22. 如何在主窗體打開後隱藏或關閉啓動loginform?
- 23. JavaScript - 打開開關,然後關閉
- 24. C# - 如何關閉主窗體和子窗體(只有當主窗體關閉時子窗口才會關閉)
- 25. 如何關閉主窗體而不關閉子窗體?
- 26. bootstrap modal在打開或關閉時彈動主屏幕
- 27. 以ShowDialog形式打開窗體但關閉窗體
- 28. 關閉一個窗體並打開另一個窗體
- 29. vb.net關閉多個窗體並打開另一個窗體
- 30. 打開一個新窗體,關閉舊窗體C#
那麼這個原則不是OOP的核心定義,它已被重新定義爲:http://en.wikipedia.org/wiki/Open/closed_principle – texasbruce 2012-04-20 17:44:11
這不是問題的要求。在open/closed原則的背景下'關閉'並不意味着在運行時不能'打開'類來添加新的功能(Rubyists通常稱之爲'monkey-patching')。這意味着當*設計您的類和API *您應該嘗試這樣做,以便在需求發生變化時最大限度地減少需要更改類現有功能(而不是添加全新功能)的機會。 – GMA 2016-12-10 16:12:35