2016-11-23 177 views
0

我想弄清楚如何在基類抽象類中能夠使用派生自類的實例化對象的成員值的方法。例如,假設我有一個名爲Vehicle的類,它繼承了一個名爲IVehicle的接口;在抽象類方法中使用實例化的類成員作爲變量

public abstract class Vehicle : IVehicle 
{ 
    public int Wheels = 4; 

    public int CountWheels() 
    { 
     return Wheels; 
    } 
} 

比方說,那麼我不得不叫Motorcycle是繼承Vehicle作爲其它類;

public class Motorcycle : Vehicle, IVehicle 
{ 
    public int Wheels = 2; 
} 

如果我提出一個新的名爲MotorcyclenewMotorcycle我打電話newMotorcycle.CountWheels(),我得到的4而不是2.我假設這是一個在Motorcycle類我Wheels定義的問題,但我只是試着關於我所能想到的一切,以使其發揮作用,並且似乎總是忽略子類定義。我知道我可以使CountWheels()方法抽象化,並在Motorcycle類中定義它,但我試圖儘量保持基類Vehicle儘可能通用,因此我可以實現大量其他子類而不必重新定義相同的方法一遍又一遍。

我的第一個問題;我試圖做甚麼可能?如果是這樣,我的成員定義的哪部分需要改變,以便按照我打算的方式工作?

我保證我走遍了互聯網我張貼此之前,在這裏,我無法找到足夠的信息來幫助自己...

+0

爲什麼需要車輪和countWheels?你可以例如將Vehicle.countWheels中的4返回爲默認值,然後覆蓋Motorcycle.countWheels並返回2.並移除車輪。只是一個例子... – ElDuderino

+0

@ElDuderino有人可以推測這是一個MCVE,他的真實代碼是不太人爲的 – BradleyDotNET

回答

3

你會發現,有在您發佈的代碼,一個警告:

Motorcycle.Wheels隱藏繼承的成員Vehicle.Wheels ...

因此您的問題,Vehicle不知道派生類有隱藏它的一個成員(因此爲什麼隱藏是一個壞主意)。

既然你不能有虛擬域,您應該將其更改爲虛擬(或在這種情況下,抽象所以每個人都必須把它定義)財產

public abstract class Vehicle : IVehicle 
{ 
    public abstract int Wheels {get;} 

    public int CountWheels() 
    { 
     return Wheels; 
    } 
} 

public class Motorcycle : Vehicle, IVehicle 
{ 
    public int Wheels => 2; 
} 

現在每個派生類必須具有基類可以使用的Wheels屬性。

+0

我很感激。我注意到了這個警告,並試圖糾正它,但是以錯誤的方式去做。我很欣賞快速反應! – PorkchopDonut

1

你需要讓Wheels成員virtualoverride它,否則你只是「隱藏」基礎成員。你還需要將其更改爲某個屬性,以使其virtual

public abstract class Vehicle 
{ 
    public virtual int Wheels { get { return 4; } } 

    public int CountWheels() 
    { 
     return Wheels; 
    } 
} 

public class Motorcycle : Vehicle 
{ 
    public override int Wheels { get { return 2; } } 
} 
0

這是另一種選擇。而不是定義Wheels作爲虛擬財產上Vehicle,並覆蓋上Motorcycle該屬性,你可以定義Wheels作爲一個普通的屬性,然後設置它在構造函數Motorcycle

public abstract class Vehicle : IVehicle 
{ 
    public int Wheels { get; protected set; } 

    public Vehicle() 
    { 
     Wheels = 4; 
    } 

    public int CountWheels() 
    { 
     return Wheels; 
    } 
} 

public class Motorcycle : Vehicle, IVehicle 
{ 
    public Motorcycle() 
    { 
     Wheels = 2; 
    } 
}