抽象变量/属性? C#

时间:2013-04-27 01:23:01

标签: c#

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分: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;} }
}

使用接口或抽象类作为基础之间的区别:抽象类是共享实现,接口是共享合同。它们有一些共性,但符合不同的要求。例如,您可能希望在小武器和重武器之间,或在致命武器和非致命武器之间共享需求(一个通用界面 IProjectile ),同时在三个不同的抽象类上实现三个类别(<所有实现公共接口 IProjectile 的strong> LethalSmallArms , NonLethalSmallArms Howitzers

答案 2 :(得分:3)

我认为你应该采用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.
    ...
}