繁体   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