- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的代码库,其中包含几个“武器”具体类,这些具体类实现了不同的契约以供其客户使用。
我的契约(Contract):
public interface IWeaponPrimaryAttack
{
void DoAttack();
}
public interface IWeaponSecondaryAttack
{
void DoSecondaryAttack();
}
public interface IReloadable
{
void Reload();
}
具体实现或实际武器:
public class Katana : IWeaponPrimaryAttack, IWeaponSecondaryAttack
{
public void DoAttack(){Console.WriteLine ("Swing");}
public void DoSecondaryAttack() {Console.WriteLine ("Stab");}
}
public class ShotGun : IWeaponPrimaryAttack, IReloadable
{
public void DoAttack(){Console.WriteLine ("Swing");}
public void Reload() {//reload it}
}
使用这些具体类的客户端:
public class PrimaryAttack
{
private IWeaponPrimaryAttack _attack;
public PrimaryAttack(IWeaponPrimaryAttack attack)
{
_attack = attack;
}
public void DoAttack()
{
_attack.DoAttack();
}
}
public class SecondaryAttack
{
private IWeaponSecondaryAttack _attack;
public SecondaryAttack(IWeaponSecondaryAttack attack)
{
_attack = attack;
}
public void DoSecondaryAttack()
{
_attack.DoSecondaryAttack();
}
}
public class WeaponReload
{
private IReloadable _reloader;
public WeaponReload(IReloadable reloader)
{
_reloader = reloader;
}
public void Reload()
{
_reloader.Reload();
}
}
当然,新的具体类的实例只有在用户选择多种武器中的一种(ShotGun、Katana 等中的一种)时才知道。
假设用户选择了 ShotGun 作为武器,根据选择它可能是这样的:
IWeaponPrimaryAttack weapon = new ShotGun(); // get it from a factory
PrimaryAttack primaryAttack = new PrimaryAttack(weapon);
primaryAttack.DoAttack();
现在对于 WeaponReload
必须在这里进行类型转换才能使用它。
WeaponReload reloader = new WeaponReload ((IReloadable)weapon);
reloader.Reload();
我对此有疑问,
最佳答案
不太确定为什么需要所有这些额外的委托(delegate)包装器?无论如何,这里有一些事情在起作用。
您在这里为每种武器类型使用了一个具体类型,但您也可以更加强调组合并拥有一个包罗万象的 Weapon
类,将其所有内部工作委托(delegate)给 strategies .
例如
您可以使用 Weapon shotgun = Weapons.shotgun()
而不是 Weapon shotgun = new Shotgun();
,其中工厂方法可能如下所示:
return new Weapon.Builder()
.withPrimaryAttack(...)
.withoutSecondaryAttack()
.withSlowReload().build();
最大化组合使设计变得非常灵活,并且可以让您在需要时动态地引入新的武器类型,甚至可以在运行时更改武器的某些方面(例如,霰弹枪现在可以在拾取能量的情况下发射刀 b/c)。
在上述基于组合的方法中,您可能会注意到 Weapon
的界面会变得臃肿,因为武器可以执行各种操作。依赖于 Weapon
类的客户端将间接依赖于它们可能永远不会调用的所有各种隐式接口(interface)方法。
为了减少客户端耦合,您可以很好地确保将 Weapon
功能隔离到许多接口(interface)中,例如 IReloadable
等。Weapon
类将全部实现它们,但是只对武器功能的一个子集感兴趣的客户端代码仍然可以依赖于这些接口(interface)而不是 Weapon
。
例如
reload(weapon);
void reload(IReloadable reloadable) {
if (stamina < ...) throw ...;
reloadable.reload();
}
考虑到您的原始设计,我认为使用 instanceof
作为特征检测机制没有任何根本性的错误。
使用instanceof
来匹配具体类型肯定是错误的,但是匹配接口(interface)很可能没问题。
weapon instanceof Shotgun //bad
weapon instanceof IReloadable //ok
请注意,在转换之前,您应该始终检查 instanceof
。另请注意,您需要想出一种方法让武器实现者了解他们可以实现的一组潜在武器功能接口(interface)。
关于c# - 在使用对象时从一种实现类型转换为另一种实现类型是否合适?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61856870/
NHibernate version: 3.3.2. 我有一个包含多个操作的 NHibernate 事务。作为事务中的中间步骤之一,我尝试通过 Session.Save 插入一个具有自动增量 PK 的
请参阅我有一个具有多个值的 HashSet,该值可以包含例如 4141234567 、 4241234567 _0x10456790719 4141234567 _0x104567907907 和 _
我有一个 javafx 应用程序,我有一个主界面,我可以在其中设置我的舞台并启动该应用程序。我还有一个 Controller 类: public class Controller { @
我正在编写一个与 Web 服务集成的 iPhone 应用程序。我将从网络服务获取数据并用它填充表格 View 。我的问题:当用户滚动表格 View 时,我希望从 Web 服务动态加载更多数据并填充表格
我有以下结构: PreProd > Variables.tf 具有: variable "vms" { default = [ { "hostname" : "Monitor0
我下面有一个 Shiny 的应用程序,它显示绘图或表格。我对表格不感兴趣,我的问题只涉及 plotly 部分。当我使用此 javascript solution 在浏览器中打开应用程序时,我尝试下载该
我目前正在学习如何在 Java 中使用 Swing。将 JTextFields、JLabels 或 JButtons 添加到 JPanel 时,我通常用 4 行来完成,如下所示: gbc.gridx
我有一个名为 TabView 的自定义 UIView 类。每个 TabView 中都有 2 个标签以及一些其他元素。我使用界面生成器将这些标签添加到 TabView 中。在将 TabViews 作为
class A{ private List list; // getter setter public class B{ @command public void dele
当计时器达到零时,我试图从 Pane 中删除元素,更具体地说是标签和文本区域。但是,当计时器达到 0 并且我调用此方法时,我收到此异常。 Exception in thread "AWT-EventQ
使用 LINQ 时我应该从 WCF 服务返回什么?例如: var res = from q in context.cust select q; LINQ 遵循延迟执行,因此语句在运
我有一个计时器,可以在 GameScene.swift 文件中启动/重置,但是当应用程序在通话期间最小化或按下主页按钮时,它会继续运行。如何停止计时器并在应用程序再次处于事件状态时继续计时器? if
我有以下 Java 程序,但我不想在最后一个元素之后分配“,”,怎么办? String range = "400-450"; Integer startRange = null;
我正在使用 SAX 来解析一些 XML。在我的处理程序中 startElement()方法我正在尝试读取名为 xsi:type 的属性的值,例如: String type = attributes.g
我正在从事一个项目,该项目必须将数据从 Excel 文件导入和导出到数据库等。我必须从数据库获取数据,然后。但是如何根据 id、电话号码、用户名检查 excel 文件中的数据是否不重复。这是读取exc
我需要 Hook 程序的日志记录功能并获取它的日志记录参数,它使用 sqlite3_prepare_v2 -> sqlite3_bind_xxx -> sqlite3_step 函数。我想知道是否有可
您好,我正在尝试创建一个画笔,但我在使用 SelectObject 这行代码时遇到了问题: Brush_C = SelectObject(hdc_TS, hBrush); 错误是这样的: line 2
我正在尝试制作一个用户可以登录并将其用户数据保存到 mysql-db 的应用程序。我正在使用 PreferenceActivity 和 PreferenceFragment 来处理这个问题。通常这工作
我们使用自定义标签代码在 Google map 中添加带有标签的标记,还使用 MarkerCluster 库对标记进行聚类。 我们的问题是标记隐藏了,但标签仍然显示。我们需要修改http://go
我有一个包含 3 列的 CSV 文件;文本,整数,文本。当我导入这些时,所有数据都包含在双括号中。我不确定为什么。是否可以使用 COPY 在导入时删除这些内容?或者我应该导入为文本,然后使用 sele
我是一名优秀的程序员,十分优秀!