[英]Why some managers can be used as a class type, but the others have to be an object type
我一直在研究 iOS 應用程序開發和 Unity 游戲開發,我注意到在 swift 中,當您需要使用管理器(例如位置管理器)時,您必須將其用作對象,例如:
let manager = CLLocationManager()
manager.requestLocation()
但是在 Unity(使用 C#)中,您可以直接將管理器用作類類型,例如:
SceneManager.LoadScene(0);
造成差異的原因是什么? 是因為我使用的語言,還是我使用的引擎,或者僅僅是因為不同的經理有不同的調用方式?
靜態類不需要實例,因此可以直接調用方法。 從文檔中查看:靜態類與非靜態類基本相同,但有一個區別:靜態類無法實例化。 換句話說,您不能使用 new 運算符來創建類類型的變量。 由於沒有實例變量,您可以使用類名本身訪問靜態類的成員。
對於SceneManager
的情況,它不是static
類,而是靜態方法。 如果你願意,你可以在這里閱讀。
在 c# 和 Javascript 中,很多時候您需要一個實例來訪問確定類型/對象的方法。 這似乎是我不熟悉的CLLocationManager()
的情況。
總結一下,你在SceneManager
中調用的方法是靜態的, CLLocationManager
的requestLocation
估計不是,所以你需要獲取一個調用的實例。
在javascript中,除了static關鍵字本身,你還可以使用這個技巧直接調用Javascript對象的方法,有點像把對象作為命名空間。
var nameSpaceName= {
foo: function() {
},
bar: function() {
}
};
nameSpaceName.foo();
從美學上講,它消除了代碼中實例的需要,因此可以直接調用其中的方法,但當然Static
的概念是完全不同的。 我提到這一點是因為您的問題更多地關注方法的調用方式,而不是背后的概念,因此盡管值得一提的是命名空間/靜態類似的調用方式,但即使是技術概念和目的也是如此不同。
就這些系統中的任何一個而言,經理都不是“東西”。 這只是人類目的的名稱。
這些只是具有不同設計的不同 API。 沒有更多了。
一個期望您實例化它並在其新實例上調用實例方法方法,另一個期望您直接在類上調用類方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.