我目前正在尝试构造一个派生自不同对象的对象,但在调用基础构造函数之前,我想进行一些参数验证。
public FuelMotorCycle(string owner) : base(owner)
{
argumentValidation(owner);
}
现在我明白了最初首先调用了基本构造函数,有没有办法只能在argumentValidation方法之后调用它?
答案 0 :(得分:5)
将首先调用基础构造函数。
这个例子:
class Program
{
static void Main(string[] args)
{
var dc = new DerivedClass();
System.Console.Read();
}
}
class BaseClass
{
public BaseClass(){
System.Console.WriteLine("base");
}
}
class DerivedClass : BaseClass
{
public DerivedClass()
: base()
{
System.Console.WriteLine("derived");
}
}
将输出:
base
derived
答案 1 :(得分:4)
现在我明白了,最初会先调用基础构造函数, 有没有办法只能在argumentValidation方法之后调用它?
不,至少不是非常直接。
但是你可以使用一个小的解决方法你有static
方法接受参数,验证它并在它有效时返回它或如果不是则抛出异常:
private static string argumentValidate(string owner)
{
if (/* validation logic for owner */) return owner;
else throw new YourInvalidArgumentException();
}
然后让派生类构造函数在将它们提供给base
构造函数之前通过此方法传递参数:
public FuelMotorCycle(string owner) : base(argumentValidate(owner))
{
}
答案 2 :(得分:2)
首先调用基类构造函数,然后执行方法体中的所有内容。
答案 3 :(得分:1)
Base用于构造函数。派生类构造函数需要从其基类调用构造函数。当默认构造函数不存在时,可以引用自定义基本构造函数,以及基类。在派生类构造函数之前调用基类构造函数,但在基类初始化函数之前调用派生类初始化函数。还建议您查看contructor execution from msdn
using System;
public class A // This is the base class.
{
public A(int value)
{
// Executes some code in the constructor.
Console.WriteLine("Base constructor A()");
}
}
public class B : A // This class derives from the previous class.
{
public B(int value)
: base(value)
{
// The base constructor is called first.
// ... Then this code is executed.
Console.WriteLine("Derived constructor B()");
}
}
class Program
{
static void Main()
{
// Create a new instance of class A, which is the base class.
// ... Then create an instance of B, which executes the base constructor.
A a = new A(0);
B b = new B(1);
}
}
这是输出:
Base constructor A()
Base constructor A()
Derived constructor B()
答案 4 :(得分:1)
根据验证方法的不同,您可以执行以下操作:
public FuelMotorCycle(string owner)
: base(argumentValidationReturningValidatedArg(owner))
{
}
例如,如果验证函数是静态方法,则应该没问题。