類的繼承,介面的使用

名字不知道取啥發表於2024-06-06

1-知識點,題量,難度總結

1.this與super的區分與使用,如何正確使用多型(用父類型別建立子類物件,並呼叫子類中重寫父類中的抽象方法)(在大作業5中的第二道修改學生資訊中)(第三道中父類向下轉型,另外還有子類向上轉型)。
2介面的使用,多型的具體體現(例如在第一次家居強電電路模擬程式大作業中我使用了多個介面來達到程式設計的目的,其中有介面Device抽象類(所有裝置的父類,包含屬性與方法)介面Fan(風扇抽象類),介面Light(燈抽象類),有白熾燈(incandescent類),日光燈(Fluoredescent類)都繼承燈類(其中燈類中有計算流明ux的抽象方法),吊扇(ceiling類)繼承風扇類(風扇類中有計算風速的抽象方法))
3.繼承與多型的結合,一個子類(白熾燈)既繼承了父類(device),又實現了介面(Light)。
4.comparable介面與compareTo方法重寫,以及排序collection.sort的使用(在大作業四和大作五和六中)
5.題量總結,大作業四用了640行,五用了470行,六用了1020行,這三次大作業的題量對於我來說能接受,大作業六純屬是因為類太多才導致程式碼行數太多,其實就是在一些相似的類中改一些屬性和方法。在四中發現原來在構思設計類時由於方法並不是很完善,導致後續出現很多錯誤,而且這些錯誤之間基本沒有什麼聯絡,也就是說如果要改程式碼的話就需要改很多程式碼,可能導致原有程式碼的邏輯會發生較大改變。
6.難度總結:題目難度都還可以,因為在前幾次大作業的設計思路都沒有構思完全,所以導致修改程式碼時需要帶上原有的邏輯進行設計,這就導致難度加大了好多。

2-設計思路

大作業四:由於是在大作業三的基礎上改一些細節,使其輸入方法發生一些改變。

原思路:
設計思路:
單選題,填空題,多選題由於都是題目所以都繼承question類,其中包含題號,題目型別,標準答案和抽象方法判斷一道題目是完全正確,部分正確還是錯誤。
1.先判斷每行的輸入格式,將格式不正確的輸出,並將格式正確的存入到一個字串陣列中。
2.讀取被刪除的題號,並將之存到一個ArrayList裡,沒有則不需要判斷。
3.再讀取到題目資訊時,判斷該題是否被刪除,不被刪除的話則正常將每個資訊存入,並放到一個ArrayList中,否則將內容換成the question num invalid~0。
讀取多選題資訊時,先將讀取到的答案分開存入到一個arrayList中,填空題答案則是放到一個字串中。
4.讀取試卷資訊,根據試卷資訊將從questionList中提取相應題號存入到該paper中的questiongList中。
5.讀取學生資訊。
6.讀取答卷資訊,先判斷該答卷號能否找到相應的試卷,不能的話則輸出The test paper number does not exist;反之則正常判斷。
空:判斷答卷答案是否小於試卷上的題目數量,小於的話則證明有空的答案;(answer is null)
不存在:判斷試卷資訊上題號是否在questionList中找的到,找不到的話則說明不存在;(non-existent question)
找學號:在學生資訊中找,沒找到的話則輸出(is Not found),找到的話則正常輸出學號,姓名,分數,總分。
7.情況判定
(1).該題為空,直接輸出answer is null。
(2).該題存在,判斷是否存在,存在則判斷是否正確。不存在則輸出non-existent question。
(3).多選題,填空題判定方法,先判斷標準答案中是否包含學生答案,如果不包含,則答案為錯誤答案,如果包含,則往下判斷是否相等,如果相等,則為全對,不相等則則為部分正確,其他情況則為錯誤答案。

大作業五:

設計思路:因為裝置有兩個引腳,所以只需要找一個引腳所接收的裝置,一旦用正規表示式找到就直接為其建立一個相應的物件,然後進行判斷是哪種裝置。然後進行電壓計算和裝置資訊輸入。
1.將Device類設定為所有裝置類的父類。其中包含抽象方法,一些get(set)方法,還有一個display用於輸出該裝置的相關資訊。
2.電路電壓判斷,如果是開關判斷,就設定為兩種狀態,開關開啟電壓為0,否則為220。而分檔調速器和連續調速器則是用其擋位乘以220,最後輸出電壓大小。
3.利用介面Fan和Light實現計算風速和流明ux的方法。
4.其他裝置類(如Incandescent)則有名字name,電阻resistance,電壓差pd。其中也有一些重寫的方法(如Calspeed,Calux,display)。
5.其中開關Switch,分檔調速器SplitGovernor,連續調速器Continuous則分為輸入電壓inputpd,輸出電壓outputpd。輸入電壓固定為220,輸出電壓則由2說明得出。
6.裝置都接上comparable介面進行排序,按順序進行輸出。

大作業六:

設計思路:
1.主線路外的串聯電路,先匹配以#T開頭的,在進行二次匹配去找這行是否有OUT的,找到了則知道這行串聯為某並聯裡的電路。並將所有串聯電路均放在一個ArrayList中。
另外每個串聯Line類中有求總電阻的方法,如果該行只有一個開關,則判斷是否為短路還是斷開,此情況算出的該路總電阻,電壓均為0;其他則是要將開關放到一個Arrayist中,判斷所有開關是否閉合,如果該路沒有開關,則正常進行計算。該路如果為正常通路,則每個裝置的電壓則是由該裝置電阻除以總電阻乘以該路總電壓進行計算得到的。

2.找到並聯電路,jiang匹配到的T\d去找1中所提及的ArrayList中的電路,找到了之後再創一個ArrayList去儲存該並聯電路中的所有線路。該並聯電路中還有計算總電阻的方法,首先去判斷每條路上的電阻是否為0,如果不為0,則正常將其的電阻帶入計算,為0的話則忽略。該並聯電壓為每條路(正常通路)上的總電壓。

3.匹配主線路,先找開關,分檔調速器或者連續調速器,對總電路進行電壓計算,然後讀取總分路上的各個裝置,如果匹配到了開關,則判斷開關狀態,之後也是將總電路的電阻算出,每個裝置的電阻除以總電阻就得到了各個裝置分到的電壓,之後就是將電壓帶進去計算,輸出每個裝置的資訊。

類圖:

3-踩坑心得

1.大作業四中用到comparable介面時把大小搞反了,本來是從小到大輸出,結果按從大到小輸出了。

2.大作業五中忽略了只可能有一種裝置的情況,導致後面為其建立物件時有一個物件為空,不能進行正常計算。

3.設計思路一開始運用到了兩個引腳,後面發現不需要兩個引腳也能輸出。

4在使用繼承時沒有將串聯並聯也設定為Device的子類,導致後續無法計算電阻。

5.如果匹配到了開關一定要判斷是哪條線路上的開關,因為不判斷的話後續就無法根據開關對該路進行情況判斷,所以每一條串聯上都需要一個ArrayList去存放開關類。

6.細節問題,要先將開關,分檔,連續調速器的情況先處理完,然後再去算每一條串聯的電阻,再去算每一條並聯電路的電阻,一步一步來,不能隨便算,要不然很容易將邏輯搞混。

7.再計算完畢每一條並聯電路的電壓時一定要為其中的每一條串聯電路賦電壓值,每條串聯電路也是同樣為每一個裝置賦值,要不然後續有些裝置輸出為空。

4-改進建議

在大作業六中並沒有判斷該路是否為短路的情況,所以在後續大作業中我應該加一些判斷短路斷路的情況,另外正規表示式的用法也需改進,發現前幾次因為正規表示式使用不當導致資訊無法正常輸入,資料也無法提出和賦值,所以在後續的程式碼改進中會仔細將正規表示式構思清楚,另外一些介面的使用,抽象方法的重寫也應該改換,要不然後續檢查的時候很難查出問題。再後續新增了窗簾和互斥開關後,我認為窗簾由於是根據光的強度來判斷開啟程度,所以不妨將日光燈和白熾燈作為窗簾類的一種屬性,而互斥開關的兩條路分別作為兩條串聯電路,而具體指向哪條則根據正規表示式來對資訊進行讀取。

心得:一定要先構思,先構思,先構思,不要先編碼,要不然後續找邏輯錯誤很難找,邊寫程式碼邊構思出的程式碼很不完善,再後續找錯中可能要大改,縫縫補補很浪費時間和精力。

5-總結
1.題目難度還可以,就是在第六場大作業中沒有測試點的提示就需要花大量的時間去想會不會還有其他可能的測試點,如果沒有想到的話測試點基本是過不了。

2.老師上課都會講對題目的一些思路,我覺得這方面做得很好,要不然有時候擠破頭想到的一點思路可能都是不完全正確的思路就很磨人。

3.學習到了繼承更升入的方法和多型的使用,可以靈活掌握介面的使用方法,例如comparable的排序,另外再使用ArrayList時也知道將型別設定為父類,然後新增子類物件也可以照常遍歷子類物件並呼叫子類中重寫分類的方法達到目的。

相關文章