有没有更好的初始化类的方法?

时间:2015-07-20 17:11:36

标签: c# class object

我要制作某种武器清单,当然要对它们进行硬编码,这样它们就无法被攻击或修改而无需特殊的东西。而我只是想知道是否有更快的方法:

public Firearm(string WeaponName, int WeaponId, float Damage, FireType WeaponFireType, float FireRate, float ReloadTime, int MaxClip, bool InfiniteAmmo)
{
    weaponName = WeaponName;
    weaponID = WeaponId;
    damage = Damage;
    weaponFireType = WeaponFireType;
    fireRate = FireRate;
    reloadTime = ReloadTime;
    maxClip = MaxClip;
    infiniteAmmo = InfiniteAmmo;
}

然后是这个:(这只是一个例子,我不会在实际的脚本中这样做。

void InitializeWeapons()
{
    var allFirearms = new List<Firearm>();
    allFirearms.Add(new Firearm(
        "Pistol", 
        0, 12.5f, Firearm.FireType.SemiAutomatic, 
        1.2f, 1.5f, 12, true
        )); 
}

有不同的方法吗?什么东西更清洁,更容易看到发生了什么?

编辑:有点糟透,我不能把你们全部作为批准的答案,因为他们都帮助我学习了一些东西等等。我只是选择我决定使用的那个。我将完成代码并批准我使用过的代码。

3 个答案:

答案 0 :(得分:3)

也许试试Fluent Builder pattern?模式并非没有缺陷,但它确实使复杂的对象创建更具可读性。 首先,您需要添加WeaponBuilder类:

public class WeaponBuilder
{
    private string name;
    private int damage;
    private int fireRate;

    public WeaponBuilder CreateWeapon(string name)
    {
        this.name = name;
        return this;
    }

    public WeaponBuilder WithDamage(int damage)
    {
        this.damage = damage;
        return this;
    }

    public WeaponBuilder WithFireRate(int fireRate)
    {
        this.fireRate = fireRate;
        return this;
    }

    public Weapon Build()
    {
        return new Weapon(name, damage, fireRate);
    }
}

然后你就像这样创造你的武器:

    var weapon = new WeaponBuilder()
        .CreateWeapon("AK-47")
        .WithDamage(100)
        .WithFireRate(50)
        .Build();

答案 1 :(得分:1)

  1. 将信息写入某个配置文件。
  2. 添加在迭代中读取配置文件的代码并创建所需的对象。

    • 缺点: 您需要花一些时间来创建配置文件。

    • 优点: 一旦拥有它,代码将变为更清晰可扩展,为将来可能的扩展和解决方案打开。

答案 2 :(得分:1)

您可以使用T4 Text Template

  • 将您的武器存储在开发环境中的数据库/配置文件等中。
  • 在编译时生成代码,因此您的数据是硬编码的。

您的代码可能很难看,但数据文件将更易于维护,您甚至可以使用数据库或共享文件来存储数据。

要使用它,请在Visual Studio中创建扩展名为.tt的文件。看起来像这样:

以下代码未经过测试

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>

namespace Foo {
    class Bar {

        static void InitBar() {

<# 
            // Create an object for every line:
            // Create an object for every line:
            var lines = File.ReadAllLines("testfile");
            foreach(var line in lines) {
              <#= var newObject = new Weapon("#> line <#= "); #>
            }
#>
        }    

    }
}