2009-09-08 61 views
3

的力量我是新來的C#。最近我看了一個article.It建議C# - 接口 - 幫助在接口

「一個接口的實際用途是,當接口創建引用,可

上不同種類,它實現目標的工作那個界面「。

此基礎上,我測試了(我不知道我的理解是正確的)

namespace InterfaceExample 

{ 
public interface IRide 

{ 

    void Ride(); 

} 

abstract class Animal 

{ 
    private string _classification; 

    public string Classification 
    { 
    set { _classification = value;} 
    get { return _classification;} 
    } 

    public Animal(){} 

    public Animal(string _classification) 
    { 
    this._classification = _classification; 
    } 

} 

class Elephant:Animal,IRide 

{ 

    public Elephant(){} 

    public Elephant(string _majorClass):base(_majorClass) 
    { 
    } 


    public void Ride() 

    { 

    Console.WriteLine("Elephant can ride 34KPM"); 

    } 

} 

class Horse:Animal,IRide 

{ 
    public Horse(){} 

    public Horse(string _majorClass):base(_majorClass) 
    { 

    } 



    public void Ride() 

    { 
     Console.WriteLine("Horse can ride 110 KPH"); 
    } 

} 


class Test 

{ 
    static void Main() 

    { 
     Elephant bully = new Elephant("Vertebrata"); 
     Horse lina = new Horse("Vertebrata"); 
     IRide[] riders = {bully,lina}; 

     foreach(IRide rider in riders) 
     { 

     rider.Ride(); 
     } 

       Console.ReadKey(true); 
    } 
} 

} 

問題:

  • 超越這種擴展,有哪些不同的方式,我們可以利用接口的風采?

  • 什麼很關鍵的一點,我可以說這隻能通過接口(除了

    多重繼承)做了什麼?

  • (我想收集來自資深手中的信息)。

    編輯:

    編輯成概念爲中心,我猜。

    回答

    5

    因爲C#不支持多重繼承(這是一件好事恕我直言)界面是您指定共享行爲或狀態跨其他無關類型的方式。

    interface IRideable 
    { 
        void Ride(); 
    } 
    
    class Elephant : Animal, IRideable{} 
    
    class Unicycle: Machine, IRideable{} 
    

    通過這種方式,說你有這樣的建模的馬戲節目(其中機器和動物有不同的行爲,但一些機器和一些動物可能被騎),您可以創建特定的是什麼意思抽象功能騎一些東西。

    public static void RideThemAll(IEnumerable<IRideable> thingsToRide) 
    { 
        foreach(IRideable rideable in thingsToRide) 
        ridable.Ride(); 
    } 
    
    +0

    非常感謝您向我展示路徑 – user160677 2009-09-08 15:18:40

    6

    的一點是,你也可以有一個類Bike它實現IRide,不從動物繼承。你可以把接口作爲一個抽象的合同,指定這個類的對象可以做到在界面中指定的東西。

    +0

    我不知道,自行車怎麼可以吃東西... – matma 2009-09-08 14:41:32

    +0

    它可以吃了英里(風滾草......) – 2009-09-08 14:49:47

    +0

    一些概念正在吃掉我頭:) – user160677 2009-09-08 14:53:59

    1

    你問抽象類和接口之間的區別。關於那個here有一篇非常好的文章。

    +0

    否否我不是特別關注差異,我們可以通過不同的方式來增強我們實際應用界面的實例。 無論如何感謝您的關心。 – user160677 2009-09-08 14:47:05

    1

    另一大優點是軟件組件之間的下部連接。假設你想要餵養任何可供騎乘的動物。在這種情況下,你可以編寫以下方法:

    public void Feed(IRide rideable) 
    { 
        //DO SOMETHING IMPORTANT HERE 
    
        //THEN DO SOMETHING SPECIFIC TO AN IRide object 
        rideable.Eat(); 
    } 
    

    這裏的主要優點是,你可以開發和測試的送紙方法,而無需IRIDE實施的任何想法傳遞給此方法。它可能是一頭大象,馬或驢子。沒關係。這也爲使用結構映射等控制反轉框架或Rhino Mock等模擬工具打開了您的設計。

    +0

    Thanks.I希望瞭解這種優勢。 – user160677 2009-09-08 14:59:37

    +0

    +1表示「較低耦合」。 – peterchen 2009-09-08 15:06:29

    3

    由於盧塞羅指出的那樣,你可以實現實現IRide未經Animal inherting其他類,並能在您IRide[]陣列中的所有那些。

    問題是,您的IRide界面對於您的示例而言仍然過於寬泛。很明顯,它需要包括Ride()方法,但是什麼Eat()方法能夠乘坐「事物」?

    接口應該被認爲是一個鬆散的協議,它保證了成員的存在,但不是實現。它們也不應該通用於跨越「概念」(吃飯和騎馬是兩個不同的概念)。

    +0

    是的,我完全同意,未來我會改進我的設計。 – user160677 2009-09-08 15:01:57

    0

    接口可用於「標記」概念或標記具有特定功能(如可序列化)的類。這種元數據(自省或反思)可以用於強大的反轉控制框架,例如依賴注入。

    這個想法被用於整個.NET框架(如ISerializable)和第三方DI frameworks

    0

    您似乎已經掌握了接口的一般含義。

    接口只是一個合同,說「我支持這個!」沒有說明底層系統是如何工作的。

    將其與基本或抽象類相對比,該基類或抽象類說「我共享這些常用屬性&方法,但有一些我自己的新方法!」

    當然,一個類可以實現儘可能多的接口,但它只能從一個基類繼承。