[英]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.