添加新方法来接口或强制转换对象?

时间:2019-01-25 15:46:06

标签: c# design-patterns

我们有这样的界面吗?

public interface ILicense
{
   bool IsTrial { get; }
   bool IsTrialLicense { get; }
}

public class StandardLicense : ILicense
{
  public bool IsTrial { get { return true; } }
  public bool IsTrialLicense { get { return true; } }
}

但是现在对新许可证(名称为ZLicense)提出了新要求,该许可证具有其他方法。

  • GenerateActivationKey()
  • GenerateDeactivationKey()

总结ZLicense的外观如何:

public class ZLicense : ILicense
{
  public bool IsTrial { get { return true; } }
  public bool IsTrialLicense { get { return true; } }
  public string GenerateActivationKey()
  public string GenerateDeactivationKey()
}

所以我有两个选择:

  • 添加两个新方法进行接口(并创建一个抽象类)

  • 投射界面并使用新的两种方法

用法可以这样使用:

if(ILicense is ZLicense)
{
  ZLicense license = ILicense as ZLicense
  .. can use new methods lile license.GetActivationKey()
}

这里的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

如果实现__mh_execute_header的每种许可证类型都应支持ILicense,则扩展接口。

如果是这样,并且您有默认实现的想法,请选择抽象类。

如果仅GetActivationKey()具有方法ZLicense,则仅在其中实现(需要广播)。

如果将来可能会有一些不同的许可证可能支持GetActivcationKey(),但又有一些不支持该方法的许可证,请从GetActivationKey()派生一个新接口,例如ILicense。然后,实现此接口将迫使开发人员实现激活密钥处理。