Oop 从基构造函数调用重写的方法

Oop 从基构造函数调用重写的方法,oop,language-agnostic,inheritance,overriding,virtual-functions,Oop,Language Agnostic,Inheritance,Overriding,Virtual Functions,我们有这样一节课: class LogAnalyzer { protected IExtensionManager manager; public LogAnalyzer() { GetManager(); } protected virtual void GetManager() { manager = new FileExtension

我们有这样一节课:

class LogAnalyzer
    {
        protected IExtensionManager manager;

        public  LogAnalyzer()
        {
            GetManager();
        }

        protected virtual void GetManager()
        {
            manager = new FileExtensionManager();
        }
    }
class TestableLogAnalyzer:LogAnalyzer
    {
        protected override void GetManager()
        {
            this.manager = new StubExtensionManager();
        }
    }
我们衍生出另一个类似这样的类:

class LogAnalyzer
    {
        protected IExtensionManager manager;

        public  LogAnalyzer()
        {
            GetManager();
        }

        protected virtual void GetManager()
        {
            manager = new FileExtensionManager();
        }
    }
class TestableLogAnalyzer:LogAnalyzer
    {
        protected override void GetManager()
        {
            this.manager = new StubExtensionManager();
        }
    }

当我们实例化子类时,OOP规则中应该发生什么?是否调用虚方法或重写的方法?为什么?我在C#中测试了它,重写方法起了作用,但我怀疑在解释语言中可能是另一种方式。这是真的吗?

要提供一个与语言无关的答案并不简单,因为“发生了什么”取决于语言本身。例如,在Java中,将调用重写(虚拟)方法,但这可能会带来自身的问题,因此不建议这样做


你需要查阅你感兴趣的文档或语言规范,然后四处阅读,看看是否有人发表了关于你为什么应该或不应该这样做的意见,以及可能出现的问题,比如阿拉克在评论中链接到的斯科特·迈尔斯的文章。

因为它与语言无关,我将使用C++作为基础,希望可以外推。 在TestableAnalyser的构造函数之前调用LogAnalyzer的构造函数。这意味着在其工作期间,TestableAnalyser尚未构建,因此调用虚拟方法可能是危险的(它们可能使用未初始化的数据)


在您的情况下,派生类希望影响其基类的初始化。虚拟方法重写不是实现这一点的唯一方法。您可以再创建一个接受manager的构造函数,派生类将传递“new StubExtensionManager();”

一篇非常流行的文章,从C++的角度回答了这个特定的问题:@John Saunders:我想知道是否所有OO语言都以同样的方式进行。读了阿拉克的文章后,我发现情况并非如此。