构造函数中的虚拟成员,解决方法

赛斯

我有一个类BaseEmailTemplate,它格式化电子邮件,并且我想创建一个派生类型,该类型可以推翻默认值。本来我的基本构造函数-

public BaseEmailTemplate(Topic topic)
        {

                CreateAddresses(topic);
                CreateSubject(topic);
                CreateBody(topic);

        }

... (Body/Addresses)

protected virtual void CreateSubject(Topic topic)
    {
        Subject = string.Format("Base boring format: {0}", topic.Name);
    }

而在我的派生中

public NewEmailTemplate(Topic topic) : Base (topic)
        {

            //Do other things
        }

protected override void CreateSubject(Topic topic)
        {
            Subject = string.Format("New Topic: {0} - {1})", topic.Id, topic.Name);
        }

当然,这会导致此处讨论的错误:构造函数中的虚拟成员调用

因此,请对此直言不讳-我不想在每个派生类型中都调用相同的方法。另一方面,我需要能够更改任何/全部。我知道另一个基准具有不同的地址子集,但是正文和主题将是默认的。

必须调用这三种方法,并且必须在每个派生基础上具有更改其中任何一种方法的能力。

我的意思是每个人似乎在说的事是使用虚拟的意外结果似乎是我的确切意图。或者也许我过于专注并过于专注?

更新-澄清

我理解为什么构造函数中的虚拟成员不好,我很欣赏关于该主题的答案,尽管我的问题不是“为什么这样不好?” 它的“好吧,这很糟糕,但是我看不出有什么能更好地满足我的需求,那我该怎么办?”

这是目前的实施方式

 private void SendNewTopic(TopicDTO topicDto)
        {
            Topic topic = Mapper.Map<TopicDTO , Topic>(topicDto);
            var newEmail = new NewEmailTemplate(topic);
            SendEmail(newEmail);  //Preexisting Template Reader infrastructure

            //Logging.....
        }

我在跟一个孩子和孙子打交道。我进来的地方只有newemailtemplate,但是我现在还需要构建其他4个临时模板,但是90%的代码是可重用的。这就是为什么我选择创建BaseEmailTemplate(主题)的原因。BaseTemplate创建诸如Subject和List之类的内容以及SendEmail希望阅读的其他内容。

  NewEmailTemplate(Topic topic): BaseEmailTemplate(Topic topic): BaseTemplate, IEmailTempate

我宁愿不必要求任何关注我工作的人都必须知道

 var newEmail = new NewEmailTemplate();
 newEmail.Init(topic);

每次使用时都是必需的。没有它,该对象将无法使用。我以为有很多警告吗?

克莱斯

C#Specification的[10.11]告诉我们,对象构造函数从基类开始到最继承的类依次运行。而规范的[10.6.3]告诉我们,它是在运行时执行的虚拟成员的最派生实现。

这意味着您Null Reference Exception尝试从基础对象构造函数运行派生方法时,如果它访问由派生类初始化的项目,则可能会收到,因为派生对象尚未运行其构造函数。

实际上,Base方法的构造函数运行[10.11],并CreateSubject()在构造函数完成并可以运行派生的构造函数之前尝试引用派生的方法,这使该方法产生了问题。

如前所述,在这种情况下,派生方法似乎仅依赖于作为参数传递的项目,并且可以很好地运行而不会出现问题。

请注意,这只是警告,并不是错误本身,而是指示在运行时可能发生错误。

如果从基类构造函数之外的任何其他上下文调用方法,则不会有问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

解决“构造函数中的虚拟方法调用”问题

来自分类Dev

递归PowerShell函数中的调用深度溢出,是否有解决方法?

来自分类Dev

C ++:类型擦除虚拟模板解决方法

来自分类Dev

Android MediaPlayer SeekTo函数解决方法

来自分类Dev

Unity C#中构造函数的解决方法

来自分类Dev

嵌套函数相等的解决方法

来自分类Dev

使用虚拟属性支持NHibernate代理;ReSharper警告构造函数中的虚拟成员调用

来自分类Dev

rmarkdown中采购参考:解决方法

来自分类Dev

Java中的多继承解决方法?

来自分类Dev

自动成员函数的调试符号错误的解决方法?

来自分类Dev

传递成员函数(或解决方法)

来自分类Dev

另一个虚拟模板解决方法

来自分类Dev

在基本构造函数中绑定虚拟类成员函数

来自分类Dev

解决构造函数中的虚拟成员调用

来自分类Dev

从析构函数调用虚拟函数-有任何解决方法?

来自分类Dev

构造函数中的成员函数指针

来自分类Dev

从构造函数调用虚拟方法

来自分类Dev

在构造函数原型上定义的方法如何访问Javascript构造函数中的实例成员?

来自分类Dev

从dart中的静态函数访问类中的类型参数的解决方法

来自分类Dev

Android MediaPlayer SeekTo函数解决方法

来自分类Dev

rmarkdown中采购参考:解决方法

来自分类Dev

构造函数,密封和属性中的虚拟成员调用

来自分类Dev

在基本构造函数中绑定虚拟类成员函数

来自分类Dev

解决构造函数中的虚拟成员调用

来自分类Dev

C#中静态成员继承的解决方法

来自分类Dev

虚拟机-不良操作系统的解决方法?

来自分类Dev

从构造函数调用虚拟方法

来自分类Dev

Java 中 PreparedStatement 的解决方法 setDate

来自分类Dev

解决方法中的 IQueryable 和 Async

Related 相关文章

  1. 1

    解决“构造函数中的虚拟方法调用”问题

  2. 2

    递归PowerShell函数中的调用深度溢出,是否有解决方法?

  3. 3

    C ++:类型擦除虚拟模板解决方法

  4. 4

    Android MediaPlayer SeekTo函数解决方法

  5. 5

    Unity C#中构造函数的解决方法

  6. 6

    嵌套函数相等的解决方法

  7. 7

    使用虚拟属性支持NHibernate代理;ReSharper警告构造函数中的虚拟成员调用

  8. 8

    rmarkdown中采购参考:解决方法

  9. 9

    Java中的多继承解决方法?

  10. 10

    自动成员函数的调试符号错误的解决方法?

  11. 11

    传递成员函数(或解决方法)

  12. 12

    另一个虚拟模板解决方法

  13. 13

    在基本构造函数中绑定虚拟类成员函数

  14. 14

    解决构造函数中的虚拟成员调用

  15. 15

    从析构函数调用虚拟函数-有任何解决方法?

  16. 16

    构造函数中的成员函数指针

  17. 17

    从构造函数调用虚拟方法

  18. 18

    在构造函数原型上定义的方法如何访问Javascript构造函数中的实例成员?

  19. 19

    从dart中的静态函数访问类中的类型参数的解决方法

  20. 20

    Android MediaPlayer SeekTo函数解决方法

  21. 21

    rmarkdown中采购参考:解决方法

  22. 22

    构造函数,密封和属性中的虚拟成员调用

  23. 23

    在基本构造函数中绑定虚拟类成员函数

  24. 24

    解决构造函数中的虚拟成员调用

  25. 25

    C#中静态成员继承的解决方法

  26. 26

    虚拟机-不良操作系统的解决方法?

  27. 27

    从构造函数调用虚拟方法

  28. 28

    Java 中 PreparedStatement 的解决方法 setDate

  29. 29

    解决方法中的 IQueryable 和 Async

热门标签

归档