Skip to content

Latest commit

 

History

History
138 lines (111 loc) · 3.01 KB

21.md

File metadata and controls

138 lines (111 loc) · 3.01 KB

Problema

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.

Soluções

Solução 1

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