Переопределение несколько раз в разных задачах подклассов - PullRequest
0 голосов
/ 30 января 2019

При использовании этой строки кода я получаю сообщение об ошибке «Ожидается идентификатор» в строке с taskArray [i] = animalList [i]. ((Animal) animalObj) .ToString (); перед «.»((Животное). Предполагается, что этот метод будет использовать метод ToString в зависимости от того, что вводит пользователь, поскольку существует несколько подклассов, которые можно вызывать. Животное: Млекопитающее и животное: Насекомое - это то, что у меня есть в настоящее время, и мне нужно иметь возможность использоватьToString в зависимости от того, что я отправляю внутри Animal animalObj.

Просто использование .ToString () работает отлично и idk, если есть какой-либо другой способ сообщить программе, какой метод ToString я хочу, чтобы он вызывал.

    public string ListToStringArray(int x, Animal animalObj)
    {
        string[] taskArray = new string[Count];// makes another array the size of the list

        for (int i = 0; i < Count; i++) //does a loop equal to the amonut of items in the list
        {
            taskArray[i] = animalList[i].((Animal)animalObj).ToString(); //puts the values inside the list into the array 

        }
        return taskArray[x]; //returns the array number which the method calls 
    }

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Да, синтаксис неправильный, вы хотите использовать:

taskArray[i] = animalList[i].ToString();

Да, но у меня есть несколько ToString() методов внутри проекта.Как программа узнает, какой из них использовать?

Вы прокомментировали, что animalList - это List<Animal>.Так что это вызовет ToString, который переопределен в фактическом классе в этом списке.Если у вас, например, есть эти животные:

abstract class Animal
{
    public override string ToString()
    {
        return "I'm just an animal, no idea what i am actually";
    }
}

class Lion : Animal
{
    public override string ToString()
    {
        return "ROAR!!!";
    }
}
class Giraffe : Animal
{
    public override string ToString()
    {
        return "[Donno what noise a giraffe makes]";
    }
}

class Meerkat: Animal
{
    // no ToString
}

Тогда следующий код

var animalsList = new List<Animal> {new Lion(), new Giraffe(), new Meerkat()};
animalsList.ForEach(a => Console.WriteLine(a.ToString()));

выводит

ROAR!!!
[Donno what noise a giraffe makes]
I'm just an animal, no idea what i am actually

Вы видите, что всегда ToString, который переопределяетсявызывается, даже если список объявлен как List<Animal>.Вот как наследование работает в C #.

Если вы не переопределите его, вы получите одно из System.Object, которое просто возвращает полностью определенное имя типа объекта.

0 голосов
/ 30 января 2019
animalList[i].((Animal)animalObj).ToString();

Недопустимый синтаксис после animalList [i].Вы можете только указать метод или поле или свойство.Например:

animalList[i].ToString();

или:

animalList[i].Name;

и т. Д.

...