2013-12-09 88 views

回答

2

只有派生類時纔有意義。

您可能需要在基類中實現一些常用方法。另外,您可能需要在抽象類中初始化一些thinhgs,以便您需要構造函數。

請看下面的例子:

abstract class Fruit 
{ 
    private Logger log; 

    // init private stuff 
    public Fruit() 
    { 
     this.log = new Logger("C:\\Temp"); 
    } 

    // do common functionality 
    public int CalculatePrice(double weight) 
    { 
     return weight * GetPricePerKilo(); 
    } 

    // specific stuff must be implemented by derived classes 
    public abstract double GetPricePerKilo(); 
} 

class Apple : Fruit 
{ 
    // must implement in non-abstract derived class 
    public override double GetPricePerKilo() 
    { 
     return 4.30; 
    } 
} 
+0

謝謝你們......所以主要區別在於「抽象」關鍵字允許我根據派生類的要求定義該抽象類在不同派生類中的全部或部分屬性,提供了一些已經定義的屬性(這種情況下的方法),可以在創建派生類的對象時使用它。我是對的先生? – Anadi

+0

@ user2897975如果某些方法或屬性是抽象的,則整個類必須是抽象的,因爲如果實現例如缺少一種方法。是的,基本上你是對的,但1)不要混淆屬性和方法,2)它在編譯時發揮作用,當定義派生類而不是派生類的對象時。 – helb

1

抽象類有抽象的某種行爲,同時還迫使你至少添加某種行爲,使其成爲一個實際的對象。把它想成公路車輛。你可以有一個抽象類RoadVehicle,它包含一個非抽象函數Drive。如果你從抽象函數繼承,我們假設一個具體的類Car,我們已經可以訪問Drive行爲。

如果您不想預定義行爲,最好使用僅包含實現該接口的每個類應具有的方法(和屬性)定義的接口。即我們可以有一個IVehicle接口,其方法Move()。那麼,陸地車輛,飛行器和水上交通工具都以不同的方式運行,因此預先定義行爲是沒有意義的,而在我們以前的案例中,行爲是相同的,我們已經可以將這種行爲添加到抽象類中。

0

抽象類的情況下,最有用的,其中一些成員將有行爲,每一個實施將獨立處理。舉個例子,一個ReadableDoubleMatrix類,有三個屬性:

int Rows {get;}; 
int Columns {get;} 
double this[int row, int column] {get;} 

最簡單通用的實現可能是一個ImmutableArrayBackedMatrix類,其中包含一個double[,]這是充滿在類的構造中,但其他實現將包括IdentityMatrix其中包含size值[RowsColumns都返回size,而this[row, column]將返回row==column ? 1.0 : 0.0]。因爲這些派生類沒有共同的字段,所以對於基類來說也是沒有意義的。但是,如果沒有任何字段,基類實例可能無法處理這些屬性。

請注意,即使人們可以例如使基類實現RowsColumns返回1,並且this返回0.0,並且代碼在某些情況下可能會發現這樣的對象有用,因此不會有任何原因代碼應該希望具有此類項的多個實例。即使代碼經常需要這樣一個矩陣,並且希望它是與所有其他矩陣不同的類型,通常最好使用這種密封類型。