【问题标题】:Why the method is not called in the derived class为什么派生类中没有调用该方法
【发布时间】:2018-10-03 04:52:30
【问题描述】:

我有一个带有虚方法的基类,我在派生类中覆盖了它,但执行时没有任何反应。

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();
    }
}

当我初始化派生的(new Derived("proxy"))类时,showstatus方法没有被调用。

【问题讨论】:

  • 由于多种原因,此代码无法编译
  • 您的 Derived 类不仅继承自 Browser 类,而且您还在该类中定义了 private Browser Browser;。这是故意的吗?
  • @JohnLBevan 这叫做 Proxy 模式
  • @T.S.一定程度上同意;即涵盖对Browser的内部引用的使用;但我的意思是Derived 已经是Browser;因此它已经通过继承获得了该引用。如果DerivedBrowser 都继承自IBrowser,那么这种模式会更有意义;但在这种情况下,Derived 已经有 base,它做同样的工作。
  • @JohnLBevan 是的。经典代理将从接口等继承。但现实生活中的实现可能会有所不同。这是 Proxy-Decorator 之间的东西。我明白为什么要这样做。例如,如果我想要所有东西都像继承的类,但是 1 方法需要做一些时髦的事情,并且类是密封的。事实上,我最近遇到了这种情况——第 3 方组件中有一个错误。所以,除了我从与第三方类相同的基类继承之外,我几乎做了这个。当然,在我知道这种模式会起作用之前,我必须反思一下,看看什么能解决这个问题

标签: c#


【解决方案1】:

您正在创建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

【讨论】:

    【解决方案2】:

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

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

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

    哪个(一旦修复)将调用包含此代码的BrowserInitDriver() 方法:

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

    ShowStatus() 调用是 再次Browser 类实现的 ShowStatus(),它完全没有做任何事情:

    protected virtual void ShowStatus() 
    {
    
    }
    

    不清楚你想做什么,但你可以在你的Browser 类中定义一个abstract 方法,这样派生类必须实现它。这样,您的“基”类可以调用“派生”类中的某些内容。

    【讨论】:

      猜你喜欢
      • 2013-07-17
      • 2017-10-15
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 2016-11-10
      • 1970-01-01
      相关资源
      最近更新 更多