21 - Considera o seguinte código:
public class Power
{
public string Description { get; set; }
public int Range { get; set; }
}
public class PlayerClass
{
private int health;
private int shield;
private List<Power> powers;
public PlayerClass(int health, int shield)
{
this.health = health;
this.shield = shield;
powers = new List<Power>();
}
public void AddPower(Power p)
{
powers.Add(p);
}
}
public struct PlayerStruct
{
private int health;
private int shield;
private List<Power> powers;
public PlayerStruct(int health, int shield)
{
this.health = health;
this.shield = shield;
powers = new List<Power>();
}
public void AddPower(Power p)
{
powers.Add(p);
}
}
Pretende-se que os tipos PlayerClass
e PlayerStruct
implementem a interface
ICloneable
, de
modo a que uma chamada ao respetivo método
IClone()
devolva uma cópia profunda da instância em questão. Uma cópia profunda consiste
numa nova instância cujos campos têm o mesmo valor do objeto original. Se algum
dos campos for um tipo de referência, a instância associada deve também ser
clonada da mesma forma, e por ai fora. Reescreve o código dos tipos
PlayerClass
e PlayerStruct
de modo a que implementem
ICloneable
segundo
estas especificações.
using System;
using System.Collections.Generic;
namespace Ex21
{
public class Power
{
public string Description { get; set; }
public int Range { get; set; }
}
public class PlayerClass : ICloneable
{
private int health;
private int shield;
private List<Power> powers;
public PlayerClass(int health, int shield)
{
this.health = health;
this.shield = shield;
powers = new List<Power>();
}
public void AddPower(Power p)
{
powers.Add(p);
}
public object Clone()
{
PlayerClass retVal = (PlayerClass)this.MemberwiseClone();
retVal.powers = new List<Power>(powers);
return retVal;
}
}
public struct PlayerStruct : ICloneable
{
private int health;
private int shield;
private List<Power> powers;
public PlayerStruct(int health, int shield)
{
this.health = health;
this.shield = shield;
powers = new List<Power>();
}
public void AddPower(Power p)
{
powers.Add(p);
}
public object Clone()
{
PlayerStruct retVal = this;
retVal.powers = new List<Power>(powers);
return retVal;
}
}
}
Por Leandro Brás