2016-05-13 59 views
0

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

比如我有一个基类:

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. 我会从动物调用Init()还是这个模式坚持Init(),因为从派生类调用?

我想实现什么?

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

+0

你的第二个问题不清楚,你可以请你重新说明和解释你想达到什么目的。 –

+0

@SirajMansour更新回答你的问题 –

+0

嗯...我想我们称之为“虚拟方法”? https://msdn.microsoft.com/en-us/library/aa645767(v=vs.71).aspx - 顺便说一句,你应该看看SRP,他们在哪里把耳朵上的整个范例。 – code4life

回答

1

这就是所谓的override

重写方法提供了一个从基类继承的成员的新实现,即 。

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

2

1)这只是重写,我不知道它不止于此。但是你不能访问子类中的私有字段,它们也必须受到保护,所以你可以在你的子类中访问它们。

2)你的问题并不清楚,但我猜你在问如何从override中调用基类的方法。所有你需要做的是

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 
    } 
}