Skip to content

Latest commit

 

History

History
123 lines (103 loc) · 2.75 KB

45.md

File metadata and controls

123 lines (103 loc) · 2.75 KB

Pergunta

45 - 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.

Soluções

Solução 1

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

    // Clone the object and all the appropriate fields.
    public object Clone()
    {
        PlayerClass copy = (PlayerClass)MemberwiseClone();
        copy.powers = new List<Power>(powers);
        return copy;
    }
}

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

    // Clone the object and all the appropriate fields.
    public object Clone()
    {
        PlayerStruct copy = this;
        copy.powers = new List<Power>(powers);
        return copy;
    }
}

Por Inácio Amerio.