2013-04-27 106 views
7

我读过一些属性,我不知道如果多数民众赞成在我想要或没有。基本上我有一个抽象的弹丸类,这样所有的“子弹”都有一个共同的实现它们所附的任何“武器”都可以使用。抽象变量/属性? C#

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

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

可能存在的圆是电击枪的情况下,它确实没有伤害,但我觉得我还是应该进行申报其原因有二。

  1. 在这段代码中的显式声明没有损害值得一行代码。你不必很好,我想它没有任何关系,因为它没有提到它明确表示的损害。

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

回答

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

这也可以通过一个'abstract'类来完成(它可以符合user53961的需要),只需将'Damage'属性声明为'abstract'即可。编辑:只是要澄清,但我喜欢在这种情况下的接口方法。 (因为具有动量和物理效果的角色扮演游戏会被视为“子弹”吗?) – 2013-04-27 01:29:56

3

我想你应该从内森的回答界面的方法去。但是可以声明抽象属性。

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. 
    ... 
} 
+3

请注意,甚至可以省略'set'要求并使实现返回一个固定值。例如,'SomeBullet'可能有:'public override int Damage {get {return 5; }}' – 2013-04-27 02:05:22

8

下面是如何实现此更详细一点:

使用一个接口或一个抽象类作为基础之间
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;} } 
} 

划界:一个抽象类1A中共享实现,一个界面是共享合同。他们有一些共同点,但满足不同的要求。例如,你可能想要共享要求的小型武器和之间,或致命和非致命性武器,重型武器之间(一个公共接口IProjectile),同时实现三个类别上的三个不同的抽象类(LethalSmallArmsNonLethalSmallArms榴弹炮)全部实现通用接口IProjectile

+1

我一直比较喜欢这种方法。它的底线是:“对于任何给定的子类,从接口继承契约和从抽象基类实现,而两者必须彼此保持_independent_(即使在语义上相关)。” – heltonbiker 2015-03-06 12:42:59