首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在代码执行后调用构造函数库

在代码执行后调用构造函数库
EN

Stack Overflow用户
提问于 2012-05-26 13:44:46
回答 9查看 18.7K关注 0票数 21

假设我们有A类和B类。ClassB扩展了A类(ClassB : ClassA)

现在假设每当我实例化ClassB时,我想运行一些随机代码,然后才调用“ClassA”来访问base构造函数。

像这样:

代码语言:javascript
复制
class ClassA
{
    public ClassA()
    {
        Console.WriteLine("Initialization");
    }  
}

class ClassB : ClassA
{
    public ClassB() //: base() 
    {
        // Using :base() as commented above, I would execute ClassA ctor before                                                         //          Console.WriteLine as it is below this line... 
        Console.WriteLine("Before new");
        //base() //Calls ClassA constructor using inheritance
        //Run some more Codes here...
    }
}

在我通常使用的编程语言中,我可以做到这一点,只需在Console.WriteLine()之后调用super()即可;但我无法在C#中做到这一点。有没有其他语法或其他方法可以做到这一点?

EN

回答 9

Stack Overflow用户

发布于 2013-03-15 05:38:25

如果你可以通过调用静态方法逃脱惩罚的话,那就是另一个技巧。

代码语言:javascript
复制
public class ClassA
{
    public ClassA()
    {
        Debug.WriteLine("Call A Constructor");
    }
}

public class ClassB:ClassA
{
    public ClassB():this(aMethod())
    {
    }

    private ClassB(object empty):base()
    {
        Debug.WriteLine("Class B Second Constructor");
    }

    private static object aMethod()
    {
        Debug.WriteLine("Run me First");
        return null;
    }
}
票数 8
EN

Stack Overflow用户

发布于 2018-07-20 04:27:04

实际上,您可以:

代码语言:javascript
复制
class Foo
{
    public Foo(string s)
    {
        Console.WriteLine("inside foo");
        Console.WriteLine("foo" + s);
    }
}

class Bar : Foo
{
    public Bar(string s) : base(((Func<string>)(delegate ()
    {
        Console.WriteLine("before foo");
        return "bar" + s;
    }))())
    {
        Console.WriteLine("inside bar");
    }
}

class Program
{
    static void Main(string[] args)
    {
        new Bar("baz");
    }
}

输出:

代码语言:javascript
复制
before foo
inside foo
foobarbaz
inside bar

但如果可能的话,我宁愿不使用这个技巧。

票数 6
EN

Stack Overflow用户

发布于 2015-10-06 19:35:32

另一种优雅的解决方案是完全重新考虑对象的构造方式。在基类的构造函数中,您可以调用自己的construct函数,并且可以省略依赖的未来构造函数,方法如下:

代码语言:javascript
复制
public class ClassA
{
    public ClassA()
    {
        Construct();
    }

    public virtual void Construct()
    {
        Console.WriteLine("3");
    }
}

public class ClassB : ClassA
{
    public override void Construct()
    {
        Console.WriteLine("2");
        base.Construct();
    }
}

public class ClassC : ClassB
{
    public override void Construct()
    {
        Console.WriteLine("1");
        base.Construct();
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10763919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档