抽象变量/属性?C#

spa*_*rca 9 c#

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

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

我的问题是,由于所有"子弹"应该有一个损害,我想被迫在代码中声明子弹的伤害值.

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

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

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

nat*_*lez 9

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

public interface IProjectile 
{
    string Name { get; }

    int Damage { get; }

    void Fire();
}
Run Code Online (Sandbox Code Playgroud)

只需要在接口上定义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);
    }    
}
Run Code Online (Sandbox Code Playgroud)


Pie*_*ens 9

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

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;} }
}
Run Code Online (Sandbox Code Playgroud)

使用接口或抽象类作为基础之间的区别:抽象类是共享实现,接口是共享契约.它们有一些共性,但符合不同的要求.例如,你可能想要共享的要求(一个通用的接口IProjectile小型武器和重型武器之间)之间,或致命和非致命性武器,同时实现对三个不同的抽象类三个类别(LethalSmallArms,NonLethalSmallArms榴弹炮),其都实现了通用接口IProjectile.