2016-06-08 26 views
2

假設多邊形是我們的基類,廣場是我們的派生類,我們希望做一個派生類像這樣的實例:爲什麼我們在使用派生類型的實例時傳遞值?

Polygon polygon = new Square(4.5f); 

上面的例子是從一本書,說「有可能是實際使用派生類型,如廣場的一個實例,但只知道它是一個多邊形」

現在我的問題是:

1中的情況下派生類可能是一個基類?我的意思是,在計算機將派生類作爲基類而不知道它的情況下,或者這不是我們的意圖。

2 - 爲什麼我們應該通過像「4.5F」與派生類,爲什麼我們不能像對待,當我們進行正常類,並用實例的值:

Polygon polygon = new Square(); 
+3

第一部分可能回答C#6.0袖珍參考,由約瑟夫阿爾巴哈利&本阿爾巴哈利

對不起HTTPS:/ /stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface。第二部分大概是「因爲Square構造函數有一個float參數」 - 它根本與派生類無關。如果'Foo'沒有無參數的構造函數(或只有可選參數或參數數組的構造函數......),那麼你不能使用'new Foo()', –

+0

謝謝,我稍後會讀它,但是你確定它與界面有關嗎?我沒有得到第二部分的答案,爲什麼我們應該傳遞一個像4.5那樣的常量值而不是數據類型爲「int numbers」的變量? –

+0

這是一樣的原理,只需要基類而不是接口。是的,你*已經得到了第二部分的答案,但是你沒有詢問關於常量和變量的問題......可以在那裏傳遞一個「float」變量而不是常量。 –

回答

1

由開始最簡單的一個,數2:

在這種情況下,你要創建廣場new Square(4.5f)的一個實例,因爲廣場,這可能是一個類或結構定義了一個float作爲參數的構造函數簽名。

Square()是一個struct(結構是輕質的對象,從類也有點不同),所有的公共字段具有在其構造,其具有參數被初始化,否則編譯器將拋出一個編譯錯誤,如果你不要初始化公共領域。然而,結構有一個可以使用的隱式無參數構造函數。

編譯器提供一個默認的,無參數構造函數簽名,如果沒有,只是如果沒有構造函數定義(這僅適用於類)。

爲了簡要說明,如果您沒有任何其他構造函數重載,則必須實例化將該float傳遞爲參數的對象。在那種情況下,我假設它是一個班級。如果是struct,正如我所說的那樣,Structs有一個隱式無參數的構造函數,所以下面的代碼是有效的。

Polygon polygon = new Square(); 

現在讓我們回到第一個問題:

這一條涉及inheritancepolymorphism

在C#中一個類可以繼承一個類和很多接口,而不是更多,而struct只能繼承接口。因爲C#只允許一個類從一個類繼承,另一方面它允許你有嵌套繼承:class A:B:C:D等等。

多態性推斷出一個類可以採取多種形式。它的工作原理是派生類具有所有基類的特徵。

在C#中,公共成員的使用是靜態確定的(compiter time,而不是運行時),因此當派生對象採用其基礎對象的形式時,它只能訪問其基礎定義的成員。同樣在使用方法簽名中的基礎作爲參數的情況下,它可以接收其自身的不同實現。

我建議你讀這本書:如果我通過複雜的事情:)

+0

謝謝,你沒有使任何事情複雜化,我是一個初學者,我可以做出一些事情。 –

相關問題