gpt4 book ai didi

c# - 如何更改继承方法的类型?

转载 作者:行者123 更新时间:2023-11-30 17:29:37 24 4
gpt4 key购买 nike

我想制作一个游戏,其中我有 3 种类型的角色,每种类型对彼此类型都有不同的攻击。我想要一个带有抽象方法的抽象类 Character(这是一个要求)和 3 个继承该方法然后为每种类型重载它的类。问题是我在我的 Character 类中的攻击方法采用了一个 Character 类型参数,我必须在我的子类中用一个空方法覆盖它,这使得抽象类和方法的使用变得毫无用处。那么我能做些什么比:

    public abstract class Character
{
public abstract void Attack(Character t);
}

public class A :Character
{
public override void Attack(Character t){}

public void Attack(A x)
{
/*instructions*/
}

public void Attack(B y)
{
/*instructions*/
}

public void Attack(C z)
{
/*instructions*/
}
}

B 类和 C 类以此类推。

我也希望避免这种情况:

    public abstract class Character
{
public abstract void Attack(Character c);
}

public class A :Character
{
public override void Attack(Character t)
{
A x = t as A
if (x != null)
{
/*instructions*/
}

B y = t as B
if (y != null)
{
/*instructions*/
}

C z = t as C
if (z != null)
{
/*instructions*/
}
}
}

尽管我的英语很差,但我希望我的问题足够清楚。

最佳答案

您可以通过 dynamic 中的一点“魔法”来实现此分派(dispatch):

abstract class Character {
public void Attack(Character c) {
((dynamic)this).DoAttack((dynamic)c);
}
}
class A : Character {
public void DoAttack(A a) { Console.WriteLine("A attacks A"); }
public void DoAttack(B b) { Console.WriteLine("A attacks B"); }
public void DoAttack(C c) { Console.WriteLine("A attacks C"); }
}
class B : Character {
public void DoAttack(A a) { Console.WriteLine("B attacks A"); }
public void DoAttack(B b) { Console.WriteLine("B attacks B"); }
public void DoAttack(C c) { Console.WriteLine("B attacks C"); }
}
class C : Character {
public void DoAttack(A a) { Console.WriteLine("C attacks A"); }
public void DoAttack(B b) { Console.WriteLine("C attacks B"); }
public void DoAttack(C c) { Console.WriteLine("C attacks C"); }
}

注意 thisc 都转换为 dynamic,这就是让运行时定位相关的 DoAttack 重写而不依赖于继承结构。

Demo.

这种方法的一个优点是您可以根据需要添加新的实现:只要攻击仅限于“有效”类型的对象对,其余代码将继续工作。

这种方法的一个缺点是它不是静态类型的,这意味着即使没有处理所需交互的方法,它也可以编译。您可以通过在 Character 类本身中提供 DoAttack(Character c) 的“默认”实现来缓解此问题。

关于c# - 如何更改继承方法的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50846396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com