3

我目前正在尝试构造一个派生自不同对象的对象,但在调用基本构造函数之前,我想做一些参数验证。

public FuelMotorCycle(string owner) : base(owner)
{
    argumentValidation(owner);
}

现在我明白了,最初首先调用基本构造函数,有没有办法只能在 argumentValidation 方法之后调用它?

4

5 回答 5

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
于 2013-05-18T12:54:28.830 回答
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))
{
}
于 2013-05-18T13:23:38.027 回答
2

首先调用基类构造函数,然后执行方法体中的所有内容。

于 2013-05-18T12:54:14.270 回答
1

Base 用于构造函数。派生类构造函数需要从其基类调用构造函数。当默认构造函数不存在时,可以使用 base 引用自定义基本构造函数。基类构造函数在派生类构造函数之前被调用,但派生类构造函数在基类构造函数之前被调用。我还建议你从 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()
于 2013-05-18T12:55:19.077 回答
1

根据验证方法的不同,您可以执行以下操作:

public FuelMotorCycle(string owner) 
    : base(argumentValidationReturningValidatedArg(owner))
{
}

例如,如果验证函数是静态方法,这应该没问题。

于 2013-05-18T13:25:37.950 回答