繁体   English   中英

当您需要派生 class 字段值但您只有基本 class 字段变量时使用什么设计模式?

[英]What design pattern to use when you need derived class field values but you only have base class field variables?

考虑以下代码:

abstract class Player{
    abstract Stats getStats();
}

abstract class RangedPlayer:Player{
    RangedStats rangedStats;
    override Stats getStats() {return rangedStats;}
}

abstract class MeleePlayer:Player{
    MeleeStats meleeStats;
    override Stats getStats() {return meleeStats;}
}

class Stats{
    int maxHealth;
}

class RangedStats:Stats{
    int maxAmmo;
}

class MeleeStats:Stats{
    int meleeComboLength;
}

abstract class ThingPlayersCando{
    Player player;
    abstract void doThing(); 
}
class ThingMeleePlayersCando: ThingPlayersCando{
    abstract void doThing(){
        //getMeleeComboLength from base player class?
    }
}
class ThingRangedPlayersCando: ThingPlayersCando{
    abstract void doThing(){
        //maxAmmo from base player class?
    }
}

在这里,我让 ThingMeleePlayersCanDo 和 ThingRangedPlayersCando 都继承自 ThingPlayersCando,因为有时访问播放器 class 对两者都很有用。 但有时我也可能只想访问近战或远程统计可用的东西。

共享接口/抽象 class 是必要的,因为我想调用 doThing() 而无需关心类型。

玩家 class 中的 getStats() 是必要的,因为某些东西只需要知道所有玩家共享的东西(例如 maxHP)

我想到了以下修复:

  1. 只需将统计数据转换为适当的类型。
  2. 取消远程和近战统计并将所有字段放在单个统计 class 中。 最简单的,它不像拥有更多的数据字段会受到伤害。
  3. Player stats 是一个字典/哈希图。 丑陋的。
  4. 在 ThingRangedPlayersCanDo 构造函数中传入 RangedStats/RangedPlayer。 近战也一样。

有没有一种设计模式可以更好地解决这个问题?

当您需要派生 class 字段值但您只有基本 class 字段变量时使用什么设计模式?

您可以创建具有所需值的 class 实例。

但有时我也可能只想访问近战或远程统计可用的东西。

您可以创建 Ranged stats 的实例:

RangedStats rangedStats = new RangedStats();
int health = rangedStats.maxHealth;

IntelliSense将仅向您显示其可用的方法和参数:

在此处输入图像描述

我编辑了您的代码,因为它无法编译:

abstract class Player
{
    public abstract Stats GetStats();
}

abstract class RangedPlayer : Player
{
    RangedStats rangedStats;

    public override Stats GetStats() { return rangedStats; }
}

abstract class MeleePlayer : Player
{
    MeleeStats meleeStats;

    public override Stats GetStats() { return meleeStats; }
}

class Stats
{
    int maxHealth;
}

class RangedStats : Stats
{
    int maxAmmo;
}

class MeleeStats : Stats
{
    int meleeComboLength;
}

和其他类:

abstract class ThingPlayersCando
{
    Player player;
    public abstract void DoThing();
}
class ThingMeleePlayersCando : ThingPlayersCando
{
    public override void DoThing()
    {
        throw new NotImplementedException();
    }
}
class ThingRangedPlayersCando : ThingPlayersCando

    public void OnlyMyMethod() { }


    public override void DoThing()
    {
        throw new NotImplementedException();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM