设计一个带有接口的类

本文关键字:接口 一个 | 更新日期: 2023-09-27 18:20:37

更新

设置此类的最佳方式是什么?即调用CCD_ 1方法?我想让这个方法成为虚拟的,这样一个重写的类就可以有自己的实现。在被覆盖的类中,我将设置其他对象/属性。

public abstract class InstructionInfo : IInstruction
{
    protected readonly IUserSession UserSession;
    protected readonly IReadOnlySession ReadOnlySession;
    protected InstructionInfo(int instructionID)
    {
        InstructionID = instructionID;
    }
    protected virtual void SetupInstruction()
    {
        _myInstruction = null; //call db and set up...
    }
    #region interface members
    private Instruction _myInstruction;
    public Instruction MyInstruction
    {
        get
        {
            **SetupInstruction();**
            return _myInstruction;
        }
        private set { _myInstruction = value; }
    }
    #endregion
}

设计一个带有接口的类

这完全取决于您打算如何使用代码。如果您希望设置进程是内部的,那么您可能希望从基类型的构造函数中调用该方法。然后,可以通过重写该方法由派生类型自定义设置。类似地,如果你想用一个可以进行自定义设置的步骤来运行一些常见的设置任务,你可以创建一个类似的设置:

protected InstructionInfo(...)
{
    // ...
    SetupInstruction();
}
private void SetupInstruction()
{
    // Common setup
    // ...
    // Custom setup
    SetupInstructionCore();
}
// Either an optionally overriddable method
protected virtual void SetupInstructionCore()
{
}
// Or a required override
protected abstract void SetupInstructionCore();

我想我不完全理解你的问题,但你应该让MyInstruction的setter成为protected,这样重写类就可以在SetupInstruction()中设置它。

您还应该给属性一个更好的名称,例如Instruction而不是MyInstruction

可能我错过了什么,但只是一个示例:

// a Base abstract class 
public abstract class MyAbs
{
    public MyAbs() {        
         Init();
    }
    public virtual void Init(){
         "Do base".Dump();
    }
}
//derived
public class Derived : MyAbs
{
    public override void Init(){
        "Do child".Dump();
    }
}

要运行的代码,示例

Derived ab = new Derived();

输出?基于OO原理的是:

"Do child"

希望这是你想要的。

您的教学信息是一个实体。设置方法应该移到存储库类中,例如InstructionInfoRepository.GetInstructionInfoByID()。

稍后,您可以将上传的InstructionInfoRepository(例如IInstructionInfoRepository)注入到其他组件中,以解耦数据库访问&指令实例化逻辑。您还可以在单元测试期间将mock IInstructionInfoRepository注入到这些组件中,以避免单元测试期间的外部资源依赖性。在集成测试期间,您可以测试IInstructionInfoRepository的具体实现。

在大多数情况下,我只需要设计一个类来在自己的构造函数中设置它自己需要的字段,并让派生类在它们的构造函数中为它们设置那些字段。

如果我想要一个特定字段的设置方式被覆盖,那么我会通过一个懒惰加载的属性来使用它。

public abstract class MyClass
{
  private SomeType _someField = null; // Never touch this field in any member but
                                      // the SomeProp property
                                      // Maybe use Lazy<SomeType> to make this more obvious.
  protected SomeType CreateSomeType();
  public SomeType SomeProp
  {
    get
    {
      return _someField = _someField ?? CreateSomeType();
    }
  }
}

现在我不考虑"设置"对象,我只是表现得好像它总是准备好了SomeProp,只要我不在构造函数中使用它,它就会工作。

如果这在特定情况下不起作用,我会考虑工厂模式或存储库模式。

相关文章: