Как использовать дочерние атрибуты в унаследованном методе - PullRequest
0 голосов
/ 26 января 2019

Я делаю основную игру и хочу создать родительский класс «Персонаж», который будет родительским как для NPC, так и для персонажа игрока.То, с чем я борюсь, это когда я вызываю унаследованный метод, я хочу иметь возможность использовать атрибут, который назначен в потомке.Чтобы поместить это в контекст, я хочу написать функцию рисования, которую я могу вызвать из основной программы, которая передает объект Graphics для рисования, у меня есть метод, который работал, пока я тестировал его, помещая его непосредственно в персонажа игрока.class:

public void Draw(Graphics g)
        {
            g.DrawImage(image, coords[0], coords[1]);
        }

Итак, у меня есть это в родительском классе, но и изображение, и координаты назначены в дочернем классе.Я могу определить тип переменной, которая будет в родительском элементе, но он все еще не распознает, что они были определены.

Я называю это как player.Draw(g) (где player является экземпляром дочернего класса), ноя либо получаю "изображение является нулевым" или "изображение не определено" в зависимости от того, положил ли я Bitmap image; вверху или нет.Изображение определено в дочернем классе.

TLDR: как заставить родительский класс ссылаться на что-то определенное в дочернем классе при вызове метода из этого дочернего класса.

Ответы [ 2 ]

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

Это большой удар в темноте с информацией, но если вы можете сделать свой класс персонажа абстрактным, возможно, что-то подобное поможет вам.

По сути, реализация Draw живет с персонажемБазовый класс (абстрактный) и специализации или Изображение и Координаты живут с классами NPC и Игрока.Угадай, это то, что ты искал.

void Main()
{
    var player = new Player();
    var npc = new NPC();

    var characters = new List<Character>(new Character[] { player, npc});

    foreach (var character in characters)
    {
        character.Draw();
    }
}

abstract class Character
{
    public abstract string Image { get; }

    public abstract string Coordinate { get; }

    public void Draw()
    {
        Console.WriteLine($"Drawing Image {Image} at Coordinate {Coordinate}");
    }
}

class NPC : Character
{
    public override string Image => "NPC IMAGE";

    public override string Coordinate => "NPC Coordinate";
}

class Player : Character
{
    public override string Image => "PLAYER IMAGE";

    public override string Coordinate => "PLAYER Coordinate";
}
0 голосов
/ 26 января 2019

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

Дочерние классы, которые наследуются от родительского класса, могут затем вызывать методы своих родителей. Это всегда течет сверху вниз. С каждым дочерним классом становится все более конкретным с точки зрения функциональности.

Я настоятельно рекомендую вам провести некоторое исследование наследования для объектно-ориентированного программирования, прежде чем двигаться дальше, поскольку вы боретесь с некоторыми основами здесь.

Это было бы хорошее место для начала: https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/inheritance

...