[英]Using instantiated class members as variables in abstract class methods
我試圖弄清楚如何在基本抽象類中創建一種方法,該方法能夠使用從該類派生的實例化對象的成員值。 例如,假設我有一個名為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;
}
如果我制作了一個名為newMotorcycle
的新Motorcycle
並且我將其newMotorcycle.CountWheels()
,則得到4而不是2。我假設這是Motorcycle
類中Wheels
定義的問題,但是我已經嘗試了所有方法可以想到使它起作用,並且似乎總是想忽略子類定義。 我知道我可以使CountWheels()
方法成為抽象並在Motorcycle
類中對其進行定義,但是我試圖使Vehicle
類基本類盡可能通用,這樣我就可以實現大量其他子類,而不必重新定義一遍又一遍相同的方法。
我的第一個問題; 是我什至試圖做的事情? 如果是這樣,我的成員定義的哪一部分需要更改才能使其按照我打算的方式工作?
我保證在我將其發布在這里之前,我會搜索過互聯網,但找不到足夠的信息來幫助自己...
您會注意到發布的代碼中有一個警告:
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
屬性。
您需要將Wheels
成員設為virtual
並override
它,否則,您只是“隱藏”基礎成員。 您還需要將其更改為屬性以使其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; } }
}
查找virtual
屬性和方法( https://msdn.microsoft.com/zh-cn/library/9fkccyh4.aspx )
您需要Wheels
才能成為public virtual int Wheels {get; set;}
public virtual int Wheels {get; set;}
在基本和public override int Wheels {get; set;}
public override int Wheels {get; set;}
中的派生
然后,您可以在每個類中根據需要初始化值。
這是另一個選擇。 您可以將Wheels
定義為普通屬性,然后在Motorcycle
的構造函數中設置它,而不是將Wheels
定義為Vehicle
的虛擬屬性,並覆蓋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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.