【问题标题】:hiding implementation details through the usage of protected virtual通过使用受保护的虚拟来隐藏实现细节
【发布时间】:2016-09-09 02:24:31
【问题描述】:

一位同事向我介绍了通过允许派生类覆盖私有字段初始化来隐藏实现细节的概念。

例如我有一个基类:

public class Animal
{
   private Dog dog;
   private Cat cat;
   private Mouse mouse;

   protected virtual void Init()
   {
      dog = new Dog();
      cat = new Cat();
      mouse = new Mouse();
   }

   public void DoStuff() {}

}

这允许我覆盖基类私有的派生类中的初始化:

public class Cookie : Animal
{
   protected override void init()
   {
      //do whatever i want here
   }
}
  1. 这种类型的实现细节隐藏有名称吗?
  2. 我会从 Animal 调用 Init(),还是因为从派生类调用,所以这种模式坚持使用 Init()?

我想达到什么目的?

我有一个类(上面示例中的动物),它有大约 20 个需要初始化的私有对象,并且我希望能够在进行单元测试时定义自己的初始化方式。

【问题讨论】:

  • 您的第二个问题不清楚,能否请您重新措辞并解释您要达到的目标。
  • @SirajMansour 已更新以回答您的问题
  • 嗯...我想我们称他们为virtual methodsmsdn.microsoft.com/en-us/library/aa645767(v=vs.71).aspx - 顺便说一下,你应该看看 SRP,他们把整个范式都放在了耳朵上。
  • 当你有一个 SRP 类的类库并且你需要使用它们时,你最终会得到一个主类,你需要在其中实例化所有 SRP,这就是为什么我有 20 个

标签: c# .net visual-studio oop


【解决方案1】:

1) 这只是压倒一切,我不知道它不止于此。但是您不能访问子类中的私有字段,它们也必须受到保护,以便您可以在子类中访问它们。

2)您的问题不清楚,但我猜您是在问如何从覆盖中调用基类的方法。你需要做的就是

public class Cookie : Animal
{
   protected override void init()
   {
      //do whatever you want here
      base.init(); //This line will call the init() function in Animal. 
      //do whatever you want here
   }
}

【讨论】:

    【解决方案2】:

    简称为override

    覆盖方法提供了一个成员的新实现,它是 继承自基类。

    您可以使用base.Init();derived class 调用base class'overriden methodInit()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-27
      • 2011-06-01
      • 1970-01-01
      • 2013-08-09
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多