13

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

我知道您可以声明一个抽象类并强制定义您在其中声明的函数。我想要与变量相同的东西(我认为,显然这个功能似乎不存在,所以也许我正在考虑错误的解决方案)

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

可能会有子弹来自电击枪并且没有伤害的情况,但我觉得我仍然应该宣布它有两个原因。

  1. 代码中的显式声明零损害值得一行代码。您不必顺利进行,我想它没有任何作用,因为它没有明确说明损坏。

  2. 调试(这是主要原因,另一个是次要的)我想被强迫,所以我不忘记。我不想打错变量名或忘记完全分配一个值并寻找半小时试图弄清楚为什么我的火箭、导弹或子弹或任何东西没有造成任何损害或正在造成 1 或数量我使用的最后一个弹丸或我在抽象类中声明的浮点变量的默认值最终为。我想立即被抛出一个错误,告诉我在我的新子弹损坏之前我不能继续。

4

3 回答 3

12

属性是您正在寻找的。在界面上,您只需执行以下操作:

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);
    }    
}
于 2013-04-27T01:28:22.310 回答
11

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

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

于 2013-04-27T02:15:53.090 回答
4

我认为您应该采用 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.
    ...
}
于 2013-04-27T01:42:05.450 回答