【问题标题】:Run something after derived classes constructor在派生类构造函数之后运行一些东西
【发布时间】:2016-09-27 13:50:39
【问题描述】:

我有一个设计问题。假设我有一个基类和许多派生类。

class MyBase
{ 
    MyBase()
    {
        Record();
    }

    void Record()
    {
        /// this line is able to handle every object
        Recorder.Process(this);
    }
}

class DerivedA : MyBase
{ 
    public int SpecialPropertyOfA { get; set; }
    DerivedA(int specialPropertyOfA)
    {
        SpecialPropertyOfA = specialPropertyOfA;
    }
}

class DerivedB : MyBase
{ 
    public string SpecialPropertyOfB { get; set; }
    DerivedA(string specialPropertyOfB)
    {
        SpecialPropertyOfB = specialPropertyOfB;
    }
}

正如您可能推断的那样,我想记录派生类及其所有属性集。但是上面的例子不能记录派生类的特殊属性,因为它们在Record方法调用时没有设置。

解决这个问题的一种方法是使Record 方法protected 并将其作为派生类构造函数的最后一行调用。但这违反了我的基本原则(每个派生类都应该在初始化后立即记录)。我想通过设计制作这个mandotory。

有什么方法可以处理吗?

【问题讨论】:

  • 不可能。做到这一点的唯一方法是通过工厂来实现。对我来说,Record 功能不合适,看起来你的班级做得比它应该做的更多。
  • 如果您将 Record 作为接口/抽象并在每个 Derive 类中实现它会怎样? (你想如何使用记录中的特殊道具?)

标签: c# oop object-oriented-analysis


【解决方案1】:

再看看你要做什么。

请记住,基类构造函数在派生类的构造函数之前调用。

MyBase()
{
    Record();
}

void Record()
{
    Recorder.Process(this); // <-- What is "this" ?
}

此时this 的值是多少?

实例还没有被构造,派生类的构造函数还没有被调用,所以没有对this的引用,所以在这里你不能使用它。

您必须实例完全构建后调用此方法。


解决这个问题的一种方法是使用工厂方法:

public static class MyBaseFactory
{
     public static MyBase CreateDerivedA()
     {
         int specialPropertyOfA = // ...
         MyBase instance = new DerivedA(specialPropertyOfA);
         Recorder.Process(instance);
         return instance;
     }

     public static MyBase CreateDerivedB()
     {
         string specialPropertyOfB = // ...
         MyBase instance = new DerivedB(specialPropertyOfA);
         Recorder.Process(instance);
         return instance;
     }
}

【讨论】:

  • 我知道this 不存在,因为我需要它。虽然正在寻找解决方法,但您基本上提供了它。谢谢。
猜你喜欢
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 2011-10-10
  • 2016-06-10
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
相关资源
最近更新 更多