抽象变量/财产吗?c#

本文关键字:财产 变量 抽象 | 更新日期: 2023-09-27 18:11:01

我读了一些属性,我不确定这是否是我想要的。基本上,我有一个抽象的抛射类,这样所有的"子弹"都有一个共同的实现,任何"武器"都可以使用它们。

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

我的问题是,既然所有"子弹"都应该有损坏,我希望在代码中强制声明子弹的损坏值。

可能有一种情况,子弹来自电击枪,但它没有造成伤害,但我觉得我仍然应该申报,原因有两个。

  1. 代码中的显式声明this不做任何损害值得一行代码。你不需要做得很好,我猜它没有,因为它没有提到损害,它是明确规定的。

  2. Debugging(这是其他次要的主要原因)我要被逼,这样我才不会忘记。我不想输入错误的变量名或者忘记赋值然后花半个小时试图弄清楚为什么我的火箭,导弹,子弹或者任何东西没有造成任何伤害或者我使用的最后一个炮弹的数量或者我在抽象类中声明的float变量的默认值最终是什么。我想要立即抛出一个错误,告诉我我不能继续,直到我的新子弹有伤害。

抽象变量/财产吗?c#

属性就是你要找的。在界面上,你只需要这样做:

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

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

实现应该是这样的:

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

下面是关于如何实现这一点的更多细节:

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

使用接口或抽象类作为基的区别:抽象类是共享实现,接口是共享契约。它们有一些共同点,但满足不同的要求。例如,你可能想要在轻武器和重型武器之间,或者致命武器和非致命武器之间共享需求(一个公共接口 i抛射),同时在三个不同的抽象类(LethalSmallArmsNonLethalSmallArmsHowitzers)上实现这三个类别,它们都实现了公共接口 i抛射

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