2016-11-23 57 views
0

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

如果我提出一个新的名为MotorcyclenewMotorcycle我打电话newMotorcycle.CountWheels(),我得到的4而不是2.我假设这是一个在Motorcycle类我Wheels定义的问题,但我只是试着关于我所能想到的一切,以使其发挥作用,并且似乎总是忽略子类定义。我知道我可以使CountWheels()方法抽象化,并在Motorcycle类中定义它,但我试图尽量保持基类Vehicle尽可能通用,因此我可以实现大量其他子类而不必重新定义相同的方法一遍又一遍。

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

我保证我走遍了互联网我张贴此之前,在这里,我无法找到足够的信息来帮助自己...

+0

为什么需要车轮和countWheels?你可以例如将Vehicle.countWheels中的4返回为默认值,然后覆盖Motorcycle.countWheels并返回2.并移除车轮。只是一个例子... – ElDuderino

+0

@ElDuderino有人可以推测这是一个MCVE,他的真实代码是不太人为的 – BradleyDotNET

回答

3

你会发现,有在您发布的代码,一个警告:

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

+0

我很感激。我注意到了这个警告,并试图纠正它,但是以错误的方式去做。我很欣赏快速反应! – PorkchopDonut

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; } } 
} 
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; 
    } 
}