【问题标题】:How to use child attributes in a inherited method如何在继承的方法中使用子属性
【发布时间】:2019-01-26 03:13:59
【问题描述】:

我正在制作一个基本游戏,并想创建一个“角色”父类,它将成为 NPC 和玩家角色的父类。我正在苦苦挣扎的是,当我调用一个继承的方法时,我希望能够使用在子级中分配的属性。为了把它放到上下文中,我想编写一个绘制函数,我可以从传递要绘制的 Graphics 对象的主程序调用该函数,我在这里有一个方法可以在我测试它时通过将它直接放入玩家角色中进行测试类:

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

所以我在父类中有这个,但图像和坐标都在子类中分配。我可以定义将在父级中的变量类型,但它仍然无法识别已定义。

我将其称为 player.Draw(g)(其中 player 是子类的实例),但我要么得到“图像为空”或“图像未定义”,具体取决于我是否将 Bitmap image; 放在顶部与否。图像是在子类中定义的。

TLDR:从子类调用方法时,如何让父类引用子类中定义的内容。

【问题讨论】:

  • 这是错误的逻辑,你不能在父类的子类中调用某些东西,因为你的父类不知道子类的类型或属性或方法。但是,另一种方法是向您的函数添加另一个参数并从子类传递一些东西
  • 如果你能提供一个 minimal reproducible example 来显示你正在尝试做什么,那就太好了 - 只需向我们展示一个占位符 `// 这是我的问题`` 用于您的代码重新坚持。

标签: c# .net inheritance parent-child


【解决方案1】:

这是一个在黑暗中的信息,但如果你可以让你的 Character 类抽象,也许这样的东西会对你有所帮助。

本质上,Draw 的实现与 Character 基类(抽象)一起存在,而专业化或图像和坐标则与 NPC 和 Player 类一起存在。猜猜这就是你要找的东西。

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

【讨论】:

    【解决方案2】:

    父类不能调用子类的方法。使用继承时,您希望定义顶层(父级)通用的所有逻辑。

    从父类继承的子类可以调用其父类的方法。它总是从上往下流动。随着每个子类在功能方面变得更加具体。

    我强烈建议您在继续前进之前对面向对象编程的继承进行一些研究,因为您在这里遇到了一些基础知识。

    这是一个很好的起点:https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/inheritance

    【讨论】:

      猜你喜欢
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 2015-05-08
      • 2017-12-18
      • 2013-11-16
      • 2010-11-10
      • 2022-10-24
      相关资源
      最近更新 更多