2011-03-31 61 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

相关问题