gpt4 book ai didi

C# 值/引用传递?

转载 作者:行者123 更新时间:2023-11-30 16:20:37 25 4
gpt4 key购买 nike

我有一个类的已声明实体,并且想为其分配不同的预制模板而不更改模板。使用 const 似乎并不能解决问题。

例子:

Weapon w1;
w1 = Sword; // premade weapon.
w1.reducedamage(1); // for example a debuff

在这种情况下,预制武器的伤害会降低,并且不再可用作模板。这个问题在敌人身上变得更加深刻。

例子:

Enemy enemy;
enemy = enemies[r] // r being a randomly generated integer and enemies a list of enemy templates
Fight(player,enemy); // this method would resolve a fight between the two entities of the type Character.

这个问题在玩家类中是不可见的,因为玩家是沿着所有游戏方法传递的单一引用——因为只有一个玩家。每次玩家战斗时,敌人模板都会被“损坏”。

我将如何创建始终按值传递的模板或类/结构,这意味着第一个类的属性将与第二个类具有相同的值,而两个类之间没有任何关系?

我在这方面取得的唯一成功是创建了一个方法,该方法手动将具有模板的每个类的每个属性复制到同一类的另一个实体上;但这是非常不切实际的,因为每当添加新类或更改旧类时,它都需要不断升级。

最佳答案

我一定是遗漏了什么。这似乎是一个相当简单的问题,很容易通过继承解决,也许与某种工厂结合使用。首先,您不想使用对单个实例的引用,您希望每次都创建一个新实例,因此它是一个唯一的对象。我更喜欢类而不是结构,但是您也可以轻松地创建一个新的结构。您可以使用工厂创建具有预定义值的对象的各种预配置实例。例如,达摩克利斯之剑或命运之剑。

public static class WeaponFactory
{
public static Weapon CreateSword(SwordType type)
{
var sword = new Sword(); // plain, old default sword

// override properties based on type
switch (type)
{
case SwordType.SwordOfDamocles:
sword.FallTime = GetRandomFutureTime();
break;
case SwordType.SwordOfDestiny:
sword.Invincible = true;
break;
...
}

return sword;
}

...
}

替代使用 Action

public static class WeaponFactory
{
public static Weapon Create<T>(Action<T> decorator) where T : IWeapon, new()
{
var weapon = new T();
decorator(weapon);
return weapon;
}

public static void SwordOfDamocles(Sword sword)
{
sword.FallTime = GetRandomFallTime();
}

public static void SwordOfDestiny(Sword sword)
{
sword.Invincible = true;
}
}

var weapon = WeaponFactory.Create(WeaponFactory.SwordOfDamocles);

关于C# 值/引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14024003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com