2011-03-31 62 views
0

假設我有一些拉航空公司數據的程序。每個航空公司的數據使用不同的系統,我需要從中提取數據(xml)。由於每個系統的差異,基本上xml是不同的,也可能是一些propeterties,我決定實現一個接口來實現每個航空公司系統。我發現是,雖然各航空公司,雖然在許多方面都不盡相同,也包含許多相似之處,所以如果我第一次做的接口方式,我可能會做這樣的事情:每家航空公司在以下情況下,接口還是抽象類或兩者都更好?

public interface IAirlineSystem { 
    public void PullData(); 
} 

現在系統(我做了這些名字),我可能會做這樣的事情:

public class Oberon : IAirlineSystem { 
    string Name {get;set;} 
    int Code {get;set;} 
    public void Initialize() 
    { 
     //initialize code here 
    } 
    public void PullData() 
    { 
     //code here 
    } 
} 

以上僅僅是一個航空公司的系統,但是想象一下,我有更多的(如+10),另外一個可能是:

public class AirSys: IAirlineSystem { 
    string Name {get;set;} 
    int Code {get;set;} 
    public void Initialize() 
    { 
     //initialize code here 
    } 
    public void PullData() 
    { 
     //code here 
    } 
} 

在以上代碼中:

名稱和代碼屬性對於每個Airline系統都是唯一的。 Initialize包含每個實現的完全相同的代碼,PullData對每個系統都是唯一的。由於類中有重複項,因此我可以使用抽象類來保存Initialize方法的代碼。我聽說真正將接口和抽象類混合使用是一個很好的做法,那麼使用我的航空公司系統的例子是什麼呢?

另一件出現的事情是讓我們假設在接口中有另一個名爲ValidateData的方法,但並非所有的航空公司系統都需要調用它,但是如果我把它放在一個接口中,我需要實現一個空的方法如果不需要。有沒有辦法阻止我這樣做?這是使用抽象類的另一個原因,也許是使用虛擬方法,因此可以根據需要重寫。如果我將ValidateData作爲抽象方法,它仍然需要實現,對嗎?

回答

1

你的解釋似乎指向使用抽象類。你可以有一個抽象類來實現Initialize方法,你不需要在Oberon和AirSys子類中重複它。 PullData可以是一個抽象方法,然後可以在單獨的子類中實現。是的,只有需要ValidateData方法的類才能實現它。

例子是:

public abstract class AirlineSystemBase 
{ 
    string Name { get; set; } 
    int Code { get; set; } 

    public void Initialize() 
    { 
     //code goes here 
    } 

    public abstract void PullData(); 

} 

public class Oberon : AirlineSystemBase 
{ 
    public override void PullData() 
    { 
     //code goes here 
    } 
} 

public class AirSys : AirlineSystemBase 
{ 
    /// <summary> 
    ///  that is if say only AirSys class had a need for this ValidateData() method 
    /// </summary> 
    public void ValidateData() 
    { 
     //code goes here 
    } 

    public override void PullData() 
    { 
     //code goes here 
    } 

} 

或者如果你想同時使用接口和抽象類:

public interface IAirlineSystem 
{ 
    void PullData(); 
    void ValidateData(); 
} 

public abstract class AirlineSystemBase : IAirlineSystem 
{ 
    string Name { get; set; } 
    int Code { get; set; } 

    public void Initialize() 
    { 
     //code goes here 
    } 

    public abstract void PullData(); 

    public virtual void ValidateData() 
    { 
     //code goes here 
    } 

} 

public class Oberon : AirlineSystemBase 
{ 
    public override void PullData() 
    { 
     //code goes here 
    } 
} 

public class AirSys : AirlineSystemBase 
{ 
    /// <summary> 
    ///  that is if say only AirSys class had a need for this ValidateData() method 
    /// </summary> 
    public override void ValidateData() 
    { 
     //code goes here 
    } 

    public override void PullData() 
    { 
     //code goes here 
    } 

} 
0

一個例子,我想實現這樣的:

public interface IAirlineSystem { 
    public void PullData(); 
    public void ValidateData(); 
} 

public abstract class BaseAirlineSystem : IAirlineSystem { 
    string Name {get;set;} 
    int Code {get;set;} 

    public void Initialize() 
    { 
     // common initialize code here 
    }   

    public virtual void ValidateData() 
    { 
     //empty, override when necessary 
    } 
} 

並且示例實現:

public class AirSys: BaseAirlineSystem{ 
    public void PullData() 
    { 
     //code here 
    } 
} 
+0

如果你不介意,你能解釋你爲什麼使用一個接口和一個抽象類嗎? – Xaisoft 2011-03-31 01:59:34

+0

您可以在BaseClass中更改ValidateData的方法簽名嗎?我以爲你必須保持它一樣。我注意到在你的抽象基類中,你改變了簽名爲public virtual void而不是public void,因爲它在界面中。 – Xaisoft 2011-03-31 02:01:43

+0

當我創建一個新的AirSys對象時,最好是像AirSys airSys = new AirSys()或BaseAirlineSystem airSys = new AirSys()那樣實例化它,還是它甚至很重要? – Xaisoft 2011-03-31 02:20:43

相關問題