我正在试图弄清楚如何在基本抽象类中创建一个方法,该方法能够使用从类派生的实例化对象的成员值。例如,假设我有一个名为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
类尽可能通用,这样我就可以实现大量的其他子课程,而不必一遍又一遍地重新定义相同的方法。
我的第一个问题;是我想做的甚至可能吗?如果是这样,我的成员定义的哪一部分需要改变才能按照我打算的方式工作?
我保证在我在这里发布之前搜索了互联网,我找不到足够的信息来帮助自己......
答案 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
成员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; } }
}
答案 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;
}
}