[英]What design pattern to use when I want only some derived classes to have access to a method in base 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)
我想到了以下修复:
有没有一种设计模式可以更好地解决这个问题?
当您需要派生 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.