使用实例化的类成员作为抽象类方法中的变量

时间:2016-11-23 19:19:50

标签: c# class inheritance abstract

我正在试图弄清楚如何在基本抽象类中创建一个方法,该方法能够使用从类派生的实例化对象的成员值。例如,假设我有一个名为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;
}

如果我制作一个名为Motorcycle的新newMotorcycle并且我致电newMotorcycle.CountWheels(),我会得到4而不是2.我认为这是我Wheels的问题在Motorcycle类中的定义,但我已经尝试了我能想到的所有内容以使其工作,并且似乎总是想要忽略子类定义。我知道我可以使CountWheels()方法抽象并在Motorcycle类中定义它,但我试图保持基类Vehicle类尽可能通用,这样我就可以实现大量的其他子课程,而不必一遍又一遍地重新定义相同的方法。

我的第一个问题;是我想做的甚至可能吗?如果是这样,我的成员定义的哪一部分需要改变才能按照我打算的方式工作?

我保证在我在这里发布之前搜索了互联网,我找不到足够的信息来帮助自己......

4 个答案:

答案 0 :(得分:3)

您会注意到您发布的代码中有警告:

  

Motorcycle.Wheels隐藏继承成员Vehicle.Wheels ...

因此,您的问题,Vehicle不知道派生类有隐藏其中一个成员(因此为什么隐藏是一个坏主意)。

由于您不能拥有虚拟字段,您应该将其更改为虚拟字段(或者在这种情况下,抽象,以便每个人都必须定义它) property

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属性。

答案 1 :(得分: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; } }
}

答案 2 :(得分:0)

查找Wheels属性和方法(https://msdn.microsoft.com/en-us/library/9fkccyh4.aspx

您需要public virtual int Wheels {get; set;}public override int Wheels {get; set;}基础,'I'为派生

然后,您可以在每个班级中根据需要初始化该值。

答案 3 :(得分: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;
    }
}