假設我有一些拉航空公司數據的程序。每個航空公司的數據使用不同的系統,我需要從中提取數據(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作爲抽象方法,它仍然需要實現,對嗎?
如果你不介意,你能解釋你爲什麼使用一個接口和一個抽象類嗎? – Xaisoft 2011-03-31 01:59:34
您可以在BaseClass中更改ValidateData的方法簽名嗎?我以爲你必須保持它一樣。我注意到在你的抽象基類中,你改變了簽名爲public virtual void而不是public void,因爲它在界面中。 – Xaisoft 2011-03-31 02:01:43
當我創建一個新的AirSys對象時,最好是像AirSys airSys = new AirSys()或BaseAirlineSystem airSys = new AirSys()那樣實例化它,還是它甚至很重要? – Xaisoft 2011-03-31 02:20:43