我有一个带有虚方法的基类,我在派生类中覆盖了它,但是执行时什么也没发生。
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方法。
答案 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
哪个(一旦固定)将调用包含以下代码的Browser
类InitDriver()
方法:
Status = "Initializing driver...";
ShowStatus();
对于ShowStatus()
的{{1}}类实现,再次Browser
调用,它绝对不执行任何操作:
ShowStatus()
目前尚不清楚您想做什么,但是您可以在protected virtual void ShowStatus()
{
}
类中放置一个abstract
方法定义,以便派生类可以实现它 。这样,您的“基础”类可以在“派生”类中调用某些东西。