抽象变量/属性? C#

我已经阅读了一些关于属性的内容,我不确定那是不是我想要的。 基本上我有一个抽象的射弹类,所以所有“子弹”都有一个共同的实现,他们所附加的任何“武器”都可以使用。

我知道你可以声明一个抽象类并强制定义你在其中声明的函数。 我想对变量做同样的事情(我认为,显然这个function似乎不存在,所以也许我正在考虑解决方案错误)

我的问题是,因为所有“子弹”都应该有一个伤害,我想被迫在代码中声明子弹的伤害值。

可能存在这样一种情况:圆形枪来自电击枪并且没有损坏,但我觉得我仍然应该因为2个原因而宣布它。

  1. 代码中的显式声明确实零损坏值得一行代码。 你不必顺利,我猜它没有,因为它没有说明明确说明的损害。

  2. 调试(这是另一个小调的主要原因)我想被强迫,所以我不要忘记。 我不想错误输入变量名称或忘记完全分配一个值并寻找半小时试图弄清楚为什么我的火箭或导弹或子弹或其他任何没有造成任何损害或正在做的正是1或金额我使用的最后一个抛射物或者我在抽象类中声明的浮点变量的默认值最终为。 我想立即抛出一个错误告诉我,直到我的新子弹受到伤害我才能继续。

属性是你正在寻找的。 在一个界面上你会做这样的事情:

public interface IProjectile { string Name { get; } int Damage { get; } void Fire(); } 

只需要在接口上定义get方法,因为您只需要接口的使用者从损坏属性中读取,并且您不希望消费者写入损坏值。

实现将是这样的:

 public class Bullet : IProjectile { public string Name { get { return "Bullet"; } } public string Damage { get { return 5; } } public void Fire() { Console.WriteLine("Did {0} damage.",Damage); } } 

以下是有关如何实现此function的更多详细信息:

 public abstract class Projectile { public Name { get{return GetType().Name;} } public abstract int Damgage { get; } } public Bullet202: Projectile { public override int Damage { get{return 5;} } } public Bullet303: Projectile { public override int Damage { get{return 8;} } } 

使用接口或抽象类作为基础之间的区别:抽象类是共享实现 ,接口是共享契约 。 它们有一些共性,但满足不同的要求。 例如,您可能希望在小型武器和重型武器之间,或在致命武器和非致命武器之间共享需求(通用接口IProjectile ),同时在三个不同的抽象类( LethalSmallArmsNonLethalSmallArmsHowitzers )上实现三个类别都实现了通用接口IProjectile

我认为你应该采用Nathan的答案中的界面方法。 但是可以声明抽象属性。

 public abstract class Bullet { public abstract int Damage { get; set; } } public class SomeBullet : Bullet { public override int Damage { get; set; } //This has to be implemented. ... }