C# 如何在继承的方法中使用子属性

C# 如何在继承的方法中使用子属性,c#,.net,inheritance,parent-child,C#,.net,Inheritance,Parent Child,我正在制作一个基本游戏,希望创建一个“角色”父类,它将是NPC和玩家角色的父类。我所面临的困难是,当我调用继承的方法时,我希望能够使用在子对象中分配的属性。为了将其放到上下文中,我想编写一个绘图函数,我可以从主程序调用该函数,主程序将图形对象传递到绘图对象,我在这里有一个方法,该方法在我测试它时工作,通过将其直接放入player character类中: public void Draw(Graphics g) { g.DrawImage(image, c

我正在制作一个基本游戏,希望创建一个“角色”父类,它将是NPC和玩家角色的父类。我所面临的困难是,当我调用继承的方法时,我希望能够使用在子对象中分配的属性。为了将其放到上下文中,我想编写一个绘图函数,我可以从主程序调用该函数,主程序将图形对象传递到绘图对象,我在这里有一个方法,该方法在我测试它时工作,通过将其直接放入player character类中:

public void Draw(Graphics g)
        {
            g.DrawImage(image, coords[0], coords[1]);
        }
所以我在父类中有这个,但是图像和坐标都在子类中分配。我可以在父级中定义变量的类型,但它仍然无法识别已定义的

我称它为
player.Draw(g)
(其中player是子类的一个实例),但根据我是否放置了
位图图像,我会得到“image is null”或“image is not defined”是否在顶部。该图像是在子类中定义的


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

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

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

我强烈建议您在继续学习一些基础知识之前,先对面向对象编程的继承进行一些研究


这将是一个很好的开始:

这是一个很大的暗中信息,但如果你能使你的角色类抽象化,也许类似的东西会对你有所帮助

从本质上讲,Draw的实现与角色基类(抽象)保持一致,专门化或图像和坐标与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";
}
void Main()
{
var player=新玩家();
var npc=新npc();
var characters=新列表(新字符[]{player,npc});
foreach(字符中的变量字符)
{
character.Draw();
}
}
抽象类字符
{
公共抽象字符串图像{get;}
公共抽象字符串坐标{get;}
公众抽签()
{
Console.WriteLine($“在坐标{Coordinate}处绘制图像{Image}”);
}
}
类NPC:字符
{
公共覆盖字符串Image=>“NPC Image”;
公共覆盖字符串坐标=>“NPC坐标”;
}
职业球员:角色
{
公共覆盖字符串图像=>“玩家图像”;
公共覆盖字符串坐标=>“玩家坐标”;
}

这是错误的逻辑,不能从父类中的子类调用某些内容,因为父类不知道子类的类型、属性或方法。但是,另一种方法是向函数中添加另一个参数,并将child classis中的某些内容传递给它。如果您可以提供一个显示您正在尝试执行的操作的示例,那就给我们显示一个占位符`//这是我的问题``对于您一直使用的代码位。