Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Herança de Array?

Olá, pessoal!

Eu fiquei intrigado com uma questão em específico quanto a arrays. Segue código:


    public class Cliente
    {
        public string Nome { get; set; }
        public string CPF { get; set; }
        public string Profissao { get; set; }
    }

    public class ClienteTeste
    {
        public void MeuMetodo()
        {
            Cliente[] c = new Cliente[2];
            c[0] = new Cliente();
            c[1] = new Cliente();

            for(int i = 0; i < c.Length; i++)
            {
                // Alguma ação
            }
        }
    }

Notem que o objeto Cliente c possui a propriedade Length, mas em nenhum momento declaramos essa propriedade na classe Cliente. Inspecionando a propriedade Length reparei que ela pertence a classe Array, e não a classe Cliente, mas em nenhum momento herdamos Array em Cliente. Também notei que conseguimos utilizar indexadores no objeto Cliente c sem termos implementado o indexador na respectiva classe.

Minha dúvida é: como conseguimos utilizar index e Length sem nenhuma herança?

3 respostas

Olá Felipe, como vai?

Não entendi exatamente a pergunta sobre o index.

Sobre a utilização do Length ele faz parte do using System;, que já vem por padrão em nossas classes. Fiz um pequeno exemplo da utilização do mesmo:

static void Main(string[] args)
        {
            string nome = "Ana Luiza";

            Console.WriteLine(nome.Length);

            Console.ReadLine();
        }

Aguardo seu retorno sobre a questão do index.

Abraços!

Oi, Ana! Obrigado pelo retorno.

No decorrer do cursos aprendemos a implementar indexadores nas nossas classes, para podermos utilizar recursos como nossoLista[i].

Segue código de exemplo:

    public class Lista<T>
     {
        private T[] _array;

        public Lista(T[] lista)
        {
            _array = lista;
        }

        private T GetItemNoIndex(int index)
        {
            if (index < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(index), "Verificar índice.");
            }

            return _array[index];
        }

        public T this[int index]
        {
            get
            {
                return GetItemNoIndex(index);
            }
        }
     }

Não fizemos a implementação de indexador na classe Cliente exemplificada anteriormente, porém conseguimos indexar da mesma forma. Por que isso ocorre?

solução!

Oi Fellipe,

Sobre os indexadores/index/i, conseguimos utilizar eles por serem uma variável/atributo. Eles começam exatamente onde estamos instanciando eles. Veja:

for (int i = 0; i < length; i++)
            {

            }

No for onde estamos instanciando o i, conseguimos utilizar esse i especificamente apenas dentro do for.

Mas, por exemplo no código que compartilhou:

private T GetItemNoIndex(int index)
        {
            if (index < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(index), "Verificar índice.");
            }
        return _array[index];
        }

Perceba que o index é utilizando apenas dentro deste método, e torna-se independente estarmos utilizando-o dentro de um array[] ou para alguma validação dentro de um if, por exemplo, por ele ser uma variável/nome do método. Não tem necessariamente tem a ver com Herança.

Espero que eu tenha realmente ajudado desta vez. Se ficou com alguma dúvida ainda assim, por favor, sinta-se confortável para questionar novamente. Vou estar por aqui.

Um forte abraço!