簡體   English   中英

在抽象類方法中使用實例化的類成員作為變量

[英]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成員設為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; } }
}

查找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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM