現在、別のオブジェクトから派生するオブジェクトを構築しようとしていますが、基本コンストラクターを呼び出す前に、いくつかの引数の検証を行いたいと考えています。
public FuelMotorCycle(string owner) : base(owner)
{
argumentValidation(owner);
}
これで、最初に基本コンストラクターが最初に呼び出されることがわかりました。argumentValidation メソッドの後にのみ呼び出す方法はありますか?
現在、別のオブジェクトから派生するオブジェクトを構築しようとしていますが、基本コンストラクターを呼び出す前に、いくつかの引数の検証を行いたいと考えています。
public FuelMotorCycle(string owner) : base(owner)
{
argumentValidation(owner);
}
これで、最初に基本コンストラクターが最初に呼び出されることがわかりました。argumentValidation メソッドの後にのみ呼び出す方法はありますか?
基本コンストラクターが最初に呼び出されます。
この例:
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
今、最初に基本コンストラクターが最初に呼び出されることを理解しました.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))
{
}
基本クラスのコンストラクターが最初に呼び出され、次にメソッド本体のすべてが実行されます。
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()
検証方法によっては、次のようなことができる場合があります。
public FuelMotorCycle(string owner)
: base(argumentValidationReturningValidatedArg(owner))
{
}
たとえば、検証関数が静的メソッドの場合、これで問題ありません。