代码之家  ›  专栏  ›  技术社区  ›  Intellectual Gymnastics Lover

如何同时调用基构造函数和重载构造函数?

c#
  •  0
  • Intellectual Gymnastics Lover  · 技术社区  · 5 年前

    我想通过调用重载的ctor this 和基础系数VIA base 如下所述。

    public Child(string msg, DateTime dt) : base(msg, dt), this(msg)
        => WriteLine($"Child at {dt.Second}");
    

    显然它不会编译。

    问题

    如何调用两者?不可能吗? 请注意,我并没有询问如何通过重新排列相应的目录来调用它们的内容。

    using System;
    using static System.Console;
    
    class Parent
    {
        public Parent(string msg)
            => WriteLine($"Parent {msg}");
    
        public Parent(string msg, DateTime dt) : this(msg)
            => WriteLine($"Parent at {dt.Second}");
    }
    class Child : Parent
    {
        public Child(string msg) : base(msg)
            => WriteLine($"Child {msg}");
    
        public Child(string msg, DateTime dt) : base(msg, dt)//, this(msg)
            => WriteLine($"Child at {dt.Second}");
    }
    class Program
    {
        static void Main()
            => new Child("hi", DateTime.Now);
    }
    
    2 回复  |  直到 5 年前
        1
  •  2
  •   Ondrej Tucny    5 年前

    是的,这是不可能的。C中没有这样的结构。原因是一个构造函数 总是 调用基的构造函数;当没有由表示的特定构造函数时 base(…) ,将调用默认构造函数。

    然而,一个简单的私有方法将达到同样的目的:

    class Child : Parent
    {
        public Child(string msg) : base(msg)
            => ChildInit(msg);
    
        public Child(string msg, DateTime dt) : base(msg, dt)
        {
            ChildInit(msg);
            WriteLine($"Child at {dt.Second}");
        }
    
        private void ChildInit(string msg)
            => WriteLine($"Child {msg}");
    }
    
        2
  •  0
  •   Christopher    5 年前

    这是一个下注,但也许 factory pattern 能帮你吗?基本上,您不会得到公共构造函数,而是一个创建实例的静态函数。

    问题是构造函数中显然有很多逻辑。可能逻辑太多了。使用工厂模式有两个常见原因:

    • 你想进入单子模式。工厂就是你必须走的踏脚石。
    • 有一些工作需要同时完成:对于类用户来说太复杂,对于构造函数来说太复杂,必须在运行时完成

    构造函数本质上不是正常函数。而这种非正常状态可能会妨碍我们。工厂函数反过来又只是由工厂静态函数运行的,可以随时调用这些静态函数。通过提供自己的工厂功能,类可以成为自己的工厂。

    然而,虽然我不能说出它的名字,但我不能动摇这种绕过限制的感觉可能是一个坏主意。通常这些限制是因为你只知道 之后 这是改变你人生道路的路。而且类型安全根本不是我通常接触的东西。