iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
自我挑戰組

初階面試常見題目彙整系列 第 5

初階面試常見題目回答-OOP物件導向概念-鐵人賽第五日

  • 分享至 

  • xImage
  •  

是時候來點-OOP設計概念

我相信各位應該非常常聽到
OO什麼什麼的
其實這件事情非常簡單
SA是系統分析師
那麼OOA就會是物件導向分析
SD是系統設計師
那麼OOD就會是物件導向設計
所以
SP是...
貓咪頭腦宇宙.jpg
額...

OOP(Object-Oriented Programming,簡稱 OOP)就是物件導向概念
那麼OOP指的最重要的三點就是
封裝(Encapsulation)、繼承(Inheritance)與多型(Polymorphism)

奇怪,
似乎前幾天都說過了
https://ithelp.ithome.com.tw/upload/images/20230918/201620392LBKjbAb8w.jpg

玩笑先開到這裡,
當然還是有許多要討論的,
在這邊先為前幾日來一個完整的統合。

先從更為基礎的開始說起,
類別和物件:

類別(Class):
類別是定義物件的模板或藍圖,它描述了物件具有的屬性和方法。

物件(Object):
代表著某個具體或抽象的事物。
物件通常具有屬性(特性或資料)和方法(操作或行為)。
在程式碼中,物件是類別的實例化(Instantiation),也就是根據類別的定義創建出來的實體。

一提起類別(class)與物件(Object)
總會跟前幾天所述的封裝(Encapsulation)、繼承(Inheritance)、多型(Polymorphism)一併有關聯。

拆開來說,類別(Class)寫得那麼文謅謅的,
依筆者的看法,
最重要的就兩個字,定義,
需要定義出某個東西,才能拿著定義的東西去做出某個東西。

聽起來就像物理似的,
那麼舉例子來說,
昨天做了寬度方面的多型,Overload(多載)
那麼這次筆者帶大家看深度的多型Override(覆寫)

首先我們先定義出一個廣泛的定義,
要移動通常會基於什麼,
一個載具,
所以先訂出一個抽象類別的載具,
其中我認定抽象的載具一定有可以移動的方式,
只是不同的載具移動方式各不相同,
所以移動的具體行為不能寫死,
所以需要抽象的載具(VehicleModel)與其下的移動(Move)function。


public abstract class VehicleModel
{
	public abstract void Move();

	public static int MovingDistance(int destination, int location)
	{
		return destination - location;
	}
}

在這裡封裝的概念,
在第二日筆者把封裝說成是盒子,
但在這筆者會把這個盒子視為一塊塊零件拿來組裝,
在這裡把他一塊塊,
像是模組般的組合起來,
以至於這個class封裝了Move(移動)跟MovingDistance(移動距離)

同時也做了定義,
因為是一個廣泛的定義,
使用了抽象類別與抽象屬性。

既然我們能有一個大概念,
那麼進一步的會從大概念下延伸出細節,
以至於事情越來越明確,
在這裡筆者想到了兩個物件,
飛機與汽車,
他們皆屬於載具的這個大概念之下。


public class CarModel : VehicleModel
{
    public override void Move()
    {
        Console.WriteLine("Car is moving...");
    }
}

public class Airplane : VehicleModel
{
    public override void Move()
    {
        Console.WriteLine("Airplane is flying...");
    }
}

所以筆者定義出車子跟飛機,
繼承自載具,
並根據它們具體的移動方式,
去實作了抽象方法。

有了物件之後,
自然有著使用者來使用。

但身為使用者,
其實有時候不會去管真正實作的物件,
具體實作是要怎麼做。

例如想要去到一個目的地,

最後只要在移動的時候,
我其實只要知道我做了載具移動,
那麼該怎麼辦呢?

沒錯,
這時候就是多型該上場了,
物件是類別的實例化(instances),
也就是根據類別的定義創建出來的實體,
那麼於此,
我可以把它們指回去相同定義,
那麼我就可以直接問,
這個載具移動了沒,
而不用特定指名是哪種載具。


static void Main(string[] args)
{
	VehicleModel vehicle1 = new Car();
	VehicleModel vehicle2 = new Airplane();

	MoveAndPrint(vehicle1);
	MoveAndPrint(vehicle2);
}

static void MoveAndPrint(VehicleModel vehicle)
{
	vehicle.Move();
}

到此也就完整地說完類別(class)、物件(Object)、封裝(Encapsulation)、繼承(Inheritance)與多型(Polymorphism)。

那麼是時候來點補充了,
在有些function,
有沒有發現有時候一個static,
他是用來定義靜態類別的,
定義再什麼前面就是靜態XX,
像靜態類別、靜態屬性、靜態方法......,
那麼靜態類別是什麼呢?

以最簡單的說法就是預先載入程式運行。

就像上面,
我可以不創建物件VehicleModel,
就去使用
VehicleModel.MovingDistance(destination, location)
但同理,
像這種好處存在的同時
帶來的負面效果也是很大的,
也違反了常常會想要的依賴注入(Dependency Injection),
並且不能被繼承跟覆寫,
且是全域的值。

舉個形象相近的例子,
靜態變數的存在就像是一間房子,
建造在土地(class)上面,
不能被繼承或改建(覆寫)。
雖然沒提到很重要的全域性,
但從以上的相似的推演就知道,
靜態資料如果濫用會是一件麻煩的事情,
但同時也帶來很大的好處,
不論是效能、共享與簡化程式,
都是常用的領域。

(註解:預先載入程式運行,其背後準確的原理為
提供一個容器,以存放靜態成員,以在程式運行時進行訪問。
微軟的 靜態類別和靜態類別成員 (C# 程式設計手冊)
https://learn.microsoft.com/zh-tw/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members
)

那麼關於OOP就先到此告一段落,
畢竟概念上的東西是討論不完的,
那麼我最後再提起面試官討論的題目

跟面試官的對話有所衝突,
那麼我所做的事是先聽面試官所說,
如果沒有很高的把握會先記憶下來,
後續心理調整了一天才去寄信麻煩面試官。

首先先快速帶回題目
面試官:new 一個class是這三個之中的哪一個

筆者:new一個class是封裝,也有可能是繼承。
不可能是多型。

面試官:就是多型。

在這邊要再次感謝面試官願意抽空回答面試者,
也非常感謝願意舉例子,
去解答筆者的疑惑。

而面試官的回答,
主要聚焦於一個class,
他所創建出來的instance的object有所不同,
這是一個有趣的切入點。

但關於如果要以這種切入點,
有一個比較好的方式去詢問。

一個Abstract Class如果instance會是什麼?

那麼筆者舉這個例子,
所謂的絕不是檢討面試官,
而且如果各位有順著筆者昨日的思路,
其實會發現,
照著筆者思路的話,
其實有可能的說法,
對於任何事情都可以用,
所以不論是任何人都是有可能有錯誤,
或是讓人誤會。
接著筆者要進入筆者的自我檢討,如果各位還想看下去就一起看下去

推薦閱讀---

前輩的描述與問題,筆者挺喜歡的,都是不錯的讓自己側面印證到底有沒有懂這理論。
https://blog.miniasp.com/post/2009/08/27/OOP-Basis-What-is-class-and-object

梗來源---
貓咪頭腦宇宙 - 網路上迷因,尚未查到來源
大家可以回家啦《力王》-電影結尾

--------筆者的自我檢討
--------筆者的自我檢討
--------筆者的自我檢討

這裡是拉回筆者對自身的檢討。

面試官也是人,
並且沒有多少人能有心靈相通的超能力,
題目有所偏頗或不能領會也時常有,
就像筆者所再三強調的,
筆者有錯或有許疑慮的事情指出來。

應對面試官也是同理,
當成討論知識的人算是最為理想的,
因為你們目前也沒有上下級關係,
甚至筆者在面試的時候,
往往都會表現的比上下級關係還糟糕。

筆者的特質是處於說好聽點,
是偏向謹慎、謀定而後動,
有些時候往往會帶來些弊端。

但這不是要否定人格特質,
筆者認為這其實也很重要,
而且筆者對於自身的思考邏輯,
是很滿意的。

而且任何人都不是只有一種面向,
掌握資訊的筆者,跟沒掌握的是有一定差距的,
那些狀態是我期許我可以透過什麼方式改進,
有哪種手段,會讓我把理智暫時關閉,然後盡情說話,
種種的發現或是改變,
在筆者每過一段時間發現都覺得很有意思,
至少筆者實到今日此時此刻,依然這樣認為。

反面來說展現出人格特質,
如果對面針對這些特質而去敲擊,
那代表著至少公司的代表者,
是這種態度的,
如果要選擇這一間公司,
那麼就需要承擔一定程度的這種態度。

雖然面試官的引導也很重要,
但對於自己很多的對應實際上的正確話語也很重要,
每個人有每個人的性格與思維方式,
還希望任何人都別嫌棄自己,期許各位都能順利。


上一篇
初階面試常見題目回答-多型-鐵人賽第四日
下一篇
初階面試常見題目回答-介面-鐵人賽第六日
系列文
初階面試常見題目彙整30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言