閱讀1002 返回首頁    go 阿裏雲 go 技術社區[雲棲]


連載:麵向對象葵花寶典:思想、技巧與實踐(7) - “對象”新解

有了“類”的清晰定義後,“對象”就比較容易理解了。

對象就是一個具體的類,一個真實存在的類。

前麵我們提到麵向對象是對現實世界的模擬,那麼對象就是現實世界中存在的“物體”。

 

例如,“人”是一個類,我就是一個“人”的對象,你也是“人”的對象,奧巴馬也是“人”的對象。。。。。。

又比如:你去國美買冰箱,但國美肯定沒有一個單獨叫做“冰箱”的東西賣給你,而是具體的某台海爾XX型號的冰箱、西門子XX型號的冰箱等。這裏的“冰箱”就是一個類,而具體的“某台海爾XX型號冰箱”、“某台西門子XX型號冰箱”就是一個具體的對象。

 

但是,我們要繼續深究一下:有了類,為什麼還會有對象?“類”和“對象”各自的作用是什麼?

 

我們知道,在人類出現以前,世界上就有各種各樣的物體了,有恐龍、老虎、鱷魚、鬆樹、青草、石頭、空氣。。。。。等等,也就是說,真實存在的是對象,而“類”,是有了人類文明後,根據觀察分析,加以歸納總結而的出來的。

 

在軟件世界也是這樣的,真正存在於軟件運行過程中的是“對象”,而不是“類”,“類”隻是在程序編寫中由程序員分析歸納出來的。這也是麵向對象之所以叫做“麵向對象”而不是“麵向類”的一個原因吧。

 

雖然我們前麵定義對象為“一個具體的類”,但這是否意味著必須是先有類後有對象呢?

要回答這個問題,我們首先要澄清幾個概念:現實對象、現實類、軟件對象、軟件類。

 

現實對象:你能看到的物體都可以稱為現實對象;

現實類:對現實對象的歸納總結;

軟件對象:軟件實際運行過程中存在的對象;

軟件類:軟件設計過程中歸納總結出來的類;

 

定義看起來很簡單,但它們的區別和聯係是什麼呢?

如下圖示清晰的描述了它們之間的關係:

 

 

也就是說,首先是存在現實對象,然後人們根據自己的觀察角度和要求將現實對象抽象成現實類,然後軟件設計人員基於現實類模擬出軟件類,最後在程序中將軟件類實例化成軟件對象,最終的程序就是軟件對象的活動和交互。

 

那這樣是否意味著隻有你能夠看見、能夠感知的對象才能抽象為類呢?

對於現實類和現實對象來說,可以說確實是這樣的;但對於軟件類和軟件對象並不完全是這樣的。

有一句名言叫做“電影來源於生活,但高於生活”,用在麵向對象領域中就是“軟件類來源於現實類,但高於現實類”,為什麼這麼說呢?

 

首先,現實類在軟件類中必須有對應,但並不是完全一 一對應的,有的時候需要將現實類拆成幾個軟件類。

例如:比如說ATM機是現實世界真實存在的類,但在做軟件設計的時候,可能將ATM機拆分為“ATM認證”、“ATM打印”、“ATM取款”等幾個軟件類,這些軟件類互相配合,最後完成現實世界的ATM機器的功能。

 

其次:軟件類並不一定是現實存在的

例如:策略(Strategy)是一個人的概念,但並不是你可以看見或者感知到的;但在軟件領域中,這是一個很常見的類

 

也就是說,軟件類是對現實類的模擬,但並不簡單的等同,除了實現現實類相對應的功能外,我們還會創造出許多現實中並不存在的類,而這個創造過程,正是各種設計方法、設計模式、設計原則大顯身手的地方。

 

當你創造出各種各樣、豐富多彩的對象後,各種對象開始發揮自己的功能,並且相互作用,相互影響,軟件世界就開始運作起來,呈現出多姿多彩的功能和作用,整個軟件世界都處於你的控製之下,你甚至隻需小小的修改幾行代碼,整個軟件就可能呈現完全不同的功能。

 

你,就是軟件世界的上帝!

 

一個簡單的對象實例如下:

package com.oo.demo;

public class Tester {

	public static void main(String[] args) {
		// 奧巴馬是一個“人”的對象
		Person obama = new Person();
		obama.setName("Obama");
		obama.playBasketball();
		
		System.out.println();
		
       // 我也是一個“人”的對象
		Person me = new Person();
		me.setName("Yunhua Lee");
		me.playFootball();
	}
}

================================================
轉載請注明出處:https://blog.csdn.net/yunhua_lee/article/details/18010199
=================================================

最後更新:2017-04-03 12:54:25

  上一篇:go C#中的AS、IS運算符與強製類型轉換
  下一篇:go ComBox控件下拉框選項的添加