2013-04-13 34 views
0

有人請解釋爲什麼this question中的答案主張在定義基本接口時使用擴展方法。 - 爲什麼不在他們各自的接口中包含SteerLeft()和Stop()方法? - 是否要說明不應該/不可能被「基地」強加的行爲? - 當你需要一個方向盤時,「強迫」像「轉向」行爲這樣基本的東西不是更好嗎?爲什麼使用擴展方法,如果你可以做一個正常的方法?

下面我提取了相關的代碼。的回答人指出:

您可以使用擴展方法的功能加入到C#3.0 進一步簡化呼籲那些暗示性

public interface ISteerable { SteeringWheel wheel { get; set; } } 

public interface IBrakable { BrakePedal brake { get; set; } } 

public class Vehicle : ISteerable, IBrakable 
{ 
    public SteeringWheel wheel { get; set; } 

    public BrakePedal brake { get; set; } 

    public Vehicle() { wheel = new SteeringWheel(); brake = new BrakePedal(); } 
} 

public static class SteeringExtensions 
{ 
    public static void SteerLeft(this ISteerable vehicle) 
    { 
     vehicle.wheel.SteerLeft(); 
    } 
} 

public static class BrakeExtensions 
{ 
    public static void Stop(this IBrakable vehicle) 
    { 
     vehicle.brake.ApplyUntilStop(); 
    } 
} 


public class Main 
{ 
    Vehicle myCar = new Vehicle(); 
    public void main() 
    { 
    myCar.SteerLeft(); 
    myCar.Stop(); 
    } 
} 
+1

在這種情況下,如果您有許多「ISteerables」,並且您不想複製粘貼相同的方法體到它們全部中,這會很有用。 –

+1

如果您對該特定答案有疑問,那麼爲什麼不*詢問編寫答案的人*? –

+0

@EricLippert - 因爲原來的線程是在不同的主題。我的興趣是教育,在更廣泛(比多繼承)的意義。代碼示例與註釋一起提示了一個與多重繼承不同的主題。 –

回答

1

EM不是多繼承的一些替代,而且也不是的繼承機制。這只是一個工具,如名稱建議,擴展某些類型的功能通過您的方式。

在這具體代碼沒有太大的使用感EM。正如您所指出的,只需在其主體內添加一個新方法,您就可以輕鬆擴展該類的功能。

EM非常有用的情況下,當你不能改變一個類的原始來源或不允許這樣做。

+0

與核心功能相似,例如'IEnumerable ' – Romoku

4

使用擴展方法的一點是,你的方法即使您沒有Source codereside within different assembly,也可以將method添加到現有.Net類中。

和推廣方法有助於

  1. 這些方法可以在以後添加(超過型創作時)類型已經發布之後。
  2. 擴展方法可以定位接口。
  3. 不同的人可以按照他們的需求不同地擴展相同的類型。例如

採取LINQ它提供了在任何IEnumerable類型的工作方法!

+0

從技術上講,擴展方法不會添加到類中;它增加了一個類型。 –

+0

你說的是明顯的東西,但沒有解釋我重新發布的聲明,也沒有解釋我的問題。 –

相關問題