日期:2014-05-18  浏览次数:20931 次

基类的构造函数中调用了虚函数。
//如下代码:
abstract class baseclass{
  baseclass(){
  callA();
  }
  virtual void callA();
}

class newclass:basseclass{
  newclass();
  override void callA(){};
}

baseclass中callA()因为会出现初始化顺序错误会出现警告,问题是这种情况下如何才是正确的使用多态的方法?



------解决方案--------------------
C# code
abstract class baseclass
    {
       protected baseclass()
        {
            callA();
        }
      public  abstract  void callA();
    }

    class newclass : baseclass
    {
        public newclass() { }
        public override void callA()
        {
            Console.WriteLine("new class implement!");
        }
    }



    class Program
    {

        static void Main(string[] args)
        {
            baseclass mybase = new newclass();

        }
    }

------解决方案--------------------
如果是自己设计的类,则改掉这个做法,不要在构造函数中调用虚方法,如果一定要在构造以后调用这个虚方法,那么最好是在使用New建立对象后主动的调用虚方法,比如:
baseclass bc=new baseclass();
bc.callA();

这样就避免了任何初始化的问题,并且是合理的。
不需要也不可以把虚方法在构造函数中调用。
------解决方案--------------------
构造函数中调用抽象/虚拟方法也是可以的,也没有发现编译警告,用这种方法实现差异化的构造也是行得通的
------解决方案--------------------
@soaringbird
编译确实没有警告,代码分析会有警告
@lz
考虑用Builder模式