为什么在派生类中未调用该方法

时间:2018-10-02 20:41:20

标签: c#

我有一个带有虚方法的基类,我在派生类中覆盖了它,但是执行时什么也没发生。

public class Derived : Browser 
{
    private Browser Browser;

    public string UserName;
    public string Password;


    public Derived(string proxy): base(proxy) 
    {
        Browser = new Browser(proxy);
        Browser.InitDriver(false, true);
    }

    protected override void ShowStatus() 
    {
        Debug.WriteLine(this.Status);
    }
}

基础

public class Browser 
{
    private string UserProxy;

    protected string Status = null;

    public Browser(string proxy) 
    {
        UserProxy = proxy;
    }

    protected virtual void ShowStatus() 
    {

    }

    public void InitDriver() 
    {
        Status = "Initializing driver...";
        ShowStatus();
    }
}

当我初始化派生类(新的Derived(“ proxy”))时,不会调用showstatus方法。

2 个答案:

答案 0 :(得分:3)

在调用是在Browser而非Derived上执行之前,您正在创建Browser#ShowStatus而不是Derived#ShowStatus的实例。

public Derived(string proxy): base(proxy) 
{
    Browser = new Browser(proxy);
    Browser.InitDriver(false, true);
}

只需调用InitDriver,而不是在构造函数中创建新的Browser实例:

public Derived(string proxy): base(proxy) 
{
    InitDriver(false, true);
}

也许本文可以帮助您理解组合(您实际在做什么)和继承(您打算做什么)之间的区别。

https://www.thoughtworks.com/de/insights/blog/composition-vs-inheritance-how-choose

答案 1 :(得分:1)

遵循您的逻辑,或者更好的方法是使用调试器

创建新的Derived时,构造函数会这样做:

Browser = new Browser(proxy);
Browser.InitDriver(false, true); //This wont compile BTW

哪个(一旦固定)将调用包含以下代码的BrowserInitDriver()方法:

Status = "Initializing driver...";
ShowStatus();

对于ShowStatus()的{​​{1}}类实现,再次Browser调用,它绝对不执行任何操作:

ShowStatus()

目前尚不清楚您想做什么,但是您可以在protected virtual void ShowStatus() { } 类中放置一个abstract方法定义,以便派生类可以实现它 。这样,您的“基础”类可以在“派生”类中调用某些东西。