2011-01-26 26 views
4

我的姐夫是大學新生工程專業。他沒有任何編程經驗。他在課堂上學習編程,但他似乎在與基本概念鬥爭。這並不意味着他似乎是所有課程中唯一沒有編程背景的人。如何向初學者描述面向對象的編程?有一個很好的現實世界的比喻?

他在Matlab(我不知道)中確定了,然後在他學習Python的基礎知識時幫助他。很快他的課程將從C和C++開始。我擔心當面向對象編程出現時他會被拋在後面。

我試着用汽車的比喻向他解釋。

僞代碼:

Class Car 
{ 
    public string make; 
    public string model; 
    private string milesPerGallon; 
    private float gasolineGallonsInTank = 0; 
    private float tankCapacity; 
    private float odometer = 0; 

    public Car(maxGas, mpg) 
    { 
     tankCapacity = maxGas; 
     milesPerGallon = mpg; 
    } 

    public void fillTank() 
    { 
     gasolineGallonsInTank = tankCapacity; 
    } 

    public void drive(float miles) 
    { 
     if (miles == 0) 
     { 
      print("You don't want to drive?"); 
      return; 
     } 

     if(miles < 0) 
     { 
      print("Ok, we're driving in reverse!"); 
      miles = Math.AbsoluteValue(miles); 
     } 

     float maxDistance = gasolineGallonsInTank/milesPerGallon; 
     if (maxDistance >= miles) 
     { 
      odometer += maxDistance; 
      gasolineGallonsInTank = 0; 
      print("You've run out of gas!"); 
      return; 
     } 

     odometer += miles; 
     gasolineGallonsInTank -= miles/milesPerGallon; 

    } 

    public float readOdometer() 
    { 
     return odometer; 
    } 

} 

我說,汽車類就像一個汽車廠,並var mySedan = new Car(12, 20)是像一個12加侖的油箱和20英里生產新車。然後,我向他展示瞭如何運行這些方法,就像汽車發生了事情。

然後,我做了第二輛車:var myMiniVan = new Car(21.5, 14)並顯示了一輛車上的運行方式如何不影響另一輛車。

但他沒有得到它。所有這一切都在他的頭上。有沒有更好或更簡單的視覺比喻我可以使用?我解釋錯了嗎?

+2

總是有 動物,人,貓,老虎學習OOP :) – 2011-01-26 13:14:01

回答

1

我們老師過去:

  • 汽車及其零部件 - 解釋類,字段,方法和顯示什麼是聚合和組合
  • 動物(人,虎貓,正是: )) - 來解釋繼承
  • 形狀 - 來解釋更繼承和多態

而且,據我記得,有w ^在OOA&D book by Grady Booch中有一些很好的例子。

在第一OOP研討會上我們做了相當不尋常的一個有趣的練習:我們C(不是C++)中實現「類」。我們不得不使用結構和函數指針 - 這讓我們覺得,是什麼狀態,什麼是行爲,什麼是類和對象。然後我們繼續到C++。

UPDATE

我只是還記得一個更良好的和描述性的基本OOP概念例如:GUI組件(按鈕,文本框,字幕,對話框)。這些例子不像動物和汽車那樣「抽象」,而且它們相當具有描述性 - 結果可以立即看到。 有許多GUI框架, - 你可以建議你的兄弟玩一個。

1

也許你應該採取的程序,他理解(在python爲例)。並向他展示遵循oo方法的好處。這是我學習C++之後的一些基本C知識。但我認爲你的解釋已經很清楚了。

0

另一個很好的比喻(特別是對於工程系學生)可能是機器零件。

取化油器。 Carburrettor A設計用於滿足特定馬達的某些特定要求,包括歧管和碳化物之間的接口(通常用符合接口的墊圈密封)。

兩個表面上都有一定的孔,必須排成直線,預計燃油將以特定的壓力和體積速率從氣路輸送到化油器。 Carb預計會在一定的真空壓力下向歧管輸送特定的燃料 - 空氣混合物等。

這是公共接口的良好開端。碳水化合物製造商不需要對碳氫化合物和歧管之間的接口模板以及燃料 - 空氣混合物的某些規格和歧管的預期容量有更多瞭解。同樣,馬達不關心碳水化合物如何做,它只需要在合適的壓力下將燃油輸送到歧管中的適當的孔,以便碳水化合物可以執行一些神奇的功能,並提供適當的燃料空氣混合物的需求。不同的製造商可能會以不同的方式實現這一點,但只要輸入和輸出相同,一切正常。

在碳水化合物內部,爲了更好地控制燃料的流動,並用皮托管測量真空壓力等,所有方式都發生了。這些與PRIVATE函數和方法類似。給定X的真空壓力時,我需要向歧管供應數量爲燃料Y和空氣體積Z的汽化器Knwos的方式。儘管這不一定非常適合描述私有成員變量,getters vs setter等,但它可以幫助我們將概念應用於Interface,Excapsulation和Private vs Public方法。對我而言,這比起私有成員變量等(特別是「接口」部分......)來說最初更難以掌握。

0

編程是最好的方法。

和他一起寫一個簡單的地址簿應用程序。 (不需要保存任何內容,因爲這是OOP學習體驗。)創建類CEntry,它代表地址簿中的每條記錄。它將包含諸如人名,街道地址,城市,州,郵政編碼和電話號碼等內容。使另一個類CName,這將有成員first,middle,last。最後,製作第三類CPhone,其會員可以是country,area_code,prefixnumber。在他寫這篇文章時,你可以解釋爲什麼類的使用對於這個應用程序是有意義的,以及從CNameCPhone繼承或者包含這些類的新實例的優點和缺點。

相關問題