假设我们有A类和B类。ClassB扩展了A类(ClassB : ClassA)
现在假设每当我实例化ClassB时,我想运行一些随机代码,然后才调用“ClassA”来访问base构造函数。
像这样:
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#中做到这一点。有没有其他语法或其他方法可以做到这一点?
发布于 2013-03-15 05:38:25
如果你可以通过调用静态方法逃脱惩罚的话,那就是另一个技巧。
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;
}
}
发布于 2018-07-20 04:27:04
实际上,您可以:
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");
}
}
输出:
before foo
inside foo
foobarbaz
inside bar
但如果可能的话,我宁愿不使用这个技巧。
发布于 2015-10-06 19:35:32
另一种优雅的解决方案是完全重新考虑对象的构造方式。在基类的构造函数中,您可以调用自己的construct
函数,并且可以省略依赖的未来构造函数,方法如下:
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();
}
}
https://stackoverflow.com/questions/10763919
复制相似问题