Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过继承来接近实体类?_C#_Inheritance - Fatal编程技术网

C# 如何通过继承来接近实体类?

C# 如何通过继承来接近实体类?,c#,inheritance,C#,Inheritance,因此,我担心的是没有完全意识到这是否是解决我的情况的最佳方法 假设我得到了一个基类“实体”。假设目的是构造类层次结构系统 public class Entity { public int _hp; private int _max_hp; public Entity(int hp) { _max_hp = hp; _hp = _max_hp; } } 我们还有其他派生类 public

因此,我担心的是没有完全意识到这是否是解决我的情况的最佳方法

假设我得到了一个基类“实体”。假设目的是构造类层次结构系统

public class Entity
{
    public int _hp;
    private int _max_hp;

    public Entity(int hp)
    {
        _max_hp        = hp;
        _hp            = _max_hp;
    }
}
我们还有其他派生类

public class d_class1: Entity
{
    public d_class1(int hp):
        base(hp)
    {
    }
}

public class d_class1_Mono: MonoBehaviour 
{
    public d_class1 d1;
}




public class d_class2: Entity
{
    public d_class2(int hp):
        base(hp)
    {
    }
}

public class d_class2_Mono: MonoBehaviour 
{
    public d_class2 d2;
}
(请原谅错误的命名约定,这是故意的)

假设从Mono继承的脚本附加到场景中的不同对象。 我想在“点击”该装置时能够区分我当前拥有的“类别”

不管怎样,我都可以避免检查所有可能的课程

我觉得自己有时必须这样做才能获得hp,只是因为我需要某种方式访问组件。也许这不是最好的方法。目前,这一切都很简单,但每门课程都有各自不同的方式(即不同的能力等)


因此,希望有人能在我的理解中透露一些知识。

您附加的游戏对象Monobhavior可以为该对象专门设置一个处理程序。例如,您可以在d_class1_Mono上实现“void OnUpdate()”,并为d_class2_Mono实现不同的更新函数

假设您不知道单击了哪个对象(因为这是通过其他类/函数路由的)- 你可以做:

obj.GetComponent()
obj.GetComponent()


无论哪一个返回非空引用,都会附加该脚本。希望这是有意义的。

我可能会在
实体
类中定义一个
虚拟
抽象
方法,每个继承的类都将实现该方法。例如,如果您既有移动实体又有不移动实体,并且您有一个在
实体中定义的
无效移动位置(Position pos)
方法:

// Mobile entity
public class d_class1: Entity
{
    // ...stuff...
    public void MoveToPosition(Position pos)
    {
        TweenPosition(_currPosition, pos, movementSpeed);
    }
}

// Immobile entity
public class d_class2: Entity
{
    // ...stuff...
    public void MoveToPosition(Position pos)
    {
        // Do nothing
    }
}
然后在逻辑/更新循环中,您可以简单地告诉所有实体
MoveToPosition(…)
,而那些不应该响应的实体将什么也不做


我发现,当我有一个通用的
接口
或一个带有通用“do something”方法的类,并让每个派生类以自己的方式处理该方法调用的“how”时,编码会更干净。

这确实有意义,但个人感觉很笨拙。我曾想过这种方法,但我觉得它既懒惰又低效。GetComponent函数是判断特定脚本是否附加到任意游戏对象的唯一方法。编辑:你也可以创建一个附加到所有游戏对象上的脚本,用来识别游戏对象的“类型”。是的,我试图避免这种情况,但这似乎是一个足够简单的解决方案。没有必要如此努力地让某样东西感觉正确,因为它可以简单地通过这个来工作。谢谢你。
// Mobile entity
public class d_class1: Entity
{
    // ...stuff...
    public void MoveToPosition(Position pos)
    {
        TweenPosition(_currPosition, pos, movementSpeed);
    }
}

// Immobile entity
public class d_class2: Entity
{
    // ...stuff...
    public void MoveToPosition(Position pos)
    {
        // Do nothing
    }
}