2017-04-26 44 views
-3
interface IVehicle 
{ 
    int Id { get; set; } 

    string Name { get; set; } 

    void Print();   
} 

class Car : IVehicle 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public void Print() 
    { 
     Console.WriteLine($"Id {Id} Name {Name}"); 
    } 
} 

衆所周知,接口只能聲明成員,而我們在從那個接口繼承的類中實現這些成員。界面和類的屬性差異

那麼有什麼區別呢?爲什麼我必須重新聲明課程中的屬性?它不能使用界面中的聲明嗎?

+0

我不明白你在問什麼你似乎理解接口和類之間的區別,你*在你的類中實現了這些屬性,至於如何使用值創建它們,你需要創建一個汽車的實例,然後爲汽車的屬性賦值。 – mason

+0

你實現了這些屬性,但沒有給它們分配任何值,因爲它們將具有默認值。 – FCin

+0

此代碼不會編譯,並且問題以不可理解的方式形成。 –

回答

1

接口定義了一個實現它的類必須遵守的合約才能編譯。一個接口沒有說明如何實現,只是它滿足接口。例如,您爲Name創建了一個必須公開getter和setter的字符串屬性。

您的汽車實施使用自動屬性來滿足界面。然而,你可以寫你的車是這樣的:

​​

而且由於它仍公開暴露與getter和setter一個字符串屬性名稱,這將是非常有效的。

首次將開創汽車(Car myCar = new Car();,它將具有默認值的屬性,但你可以改變這些值:。

IVehicle myCar = new Car(); 
myCar.Name = "The General"; 

//alternate syntax using object initializer 
IVehicle schoolBus = new Car { Name = "Magic School Bus" }; 
+0

int Id {get;設置}(在IVehicles中) public int Id {get;設置;}(在汽車) 他們都有不同的含義? – faizan

+0

@faizan接口不需要指定訪問修飾符。這是因爲一個接口正在描述一個班級必須創建的可公開訪問的合同。因此,在接口中放置'public'將是多餘的,但實現該接口的類必須使該接口描述的所有內容都公開。 – mason

+0

好吧,我現在明白了,謝謝你的幫助 – faizan

0

在您的示例中,您已定義屬性在界面中必須具有getset。他們定義在類中以同樣的方式創建一個「自動屬性」,它處理implementationon代表您,創建後盾變量等

有關自動屬性的更多閱讀見https://msdn.microsoft.com/en-us/library/bb384054.aspx,如果你想深入到他們進一步。