2009-06-26 7 views
3

ここのコードはX ++です。私はC#に精通していますが、それについてはほとんど分かりません。 MSは、C++やC#と同様の構文をしています。メソッドに追加すると、constructキーワードは何をしますか?

とにかく、以下のコードがメソッドであると仮定します。それはキーワードとして "構築"を持っています。

コンストラクタ/コンストラクタメソッドとは何ですか?関数に適用すると、constructキーワードは何に変わるのですか? また、コードが何らかの無限ループを作成すると仮定するのは間違っていますか?

私の前提は、戻り値の型が "InventMovement"のメソッドです。

static InventMovement construct(Common buffer, InventMovSubType subType = InventMovSubType::None, Common childBuffer = null) 
{ 
    InventMovement movement = InventMovement::constructNoThrow(buffer,subType,childBuffer); 

    if (!movement) 
     throw error("@SYS20765"); 

    return movement; 
} 

ありがとうございます! ケビン

答えて

8

コンストラクトはX ++のキーワードではありません。constructという静的メソッドで、InventMovementクラスを返します。これは、作成する派生クラスを知らなくても、基本クラスの派生クラスを作成できるようにするために使用されます。 AXがファクトリパターンをどのように実装しているかを示します。このパターンは、抽象基本クラスがある多くの場所でAXで使用されています。

InventMovementは、InventMov_PurchおよびInventMov_Salesのような他の多くのクラスの抽象基本クラスです。抽象クラスでnew()を呼び出すことはできません。InventMovementクラスを作成するたびにnew InventMov_Purch()またはnew InventMov_Sales()のいずれかを呼び出すswitchステートメントを使用する代わりに、InventMovement::construct()メソッドを使用してnew()を正しく呼び出します。

-1

免責事項:私はX ++について何も知らない。

ここの例に基づいて、constructキーワードはコンストラクタメソッドを作成しているようです。 C++で

、あなたは

static Foo::Foo(int arg1) { this->val = arg1 } 

私の推測では、何らかの理由で、X ++はそのコンストラクタメソッドの構文のキーワードが必要、ということである必要があるだろう。おそらく例外をスローしないことを保証するコンストラクタであるconstructNoThrowキーワードがあるようです。

+0

は本当にあなたが最も可能性の高い正しい –

+0

;-)常識と議論することはできません。私はコンストラクタメソッドに精通していないので、私は不確実です。 – Kevin

+1

'construct'はキーワードではなく、静的メソッドの名前です。 –

0

X ++にはコンストラクトキーワードがありません。 これは、ファクトリデザインパターンをX ++で実装する方法です。 通常、継承ツリーの基底(抽象)クラスに 'construct'メソッドがあります。その目的は、正しいサブクラスを簡単に構築(インスタンス化および時には初期化)することです。正しいサブクラスが作成された後、constructメソッドは、すでに作成されたサブクラスへの基本クラス参照を返します。これは多型と呼ばれます。

X ++(rougly)における構造のイディオムは、次のC++擬似コードに変換:

class Base 
{ 
public: 
    static Base * construct(int aType); 
    //some instance methods here 
}; 

class Concrete1 : public Base 
{ 
    // concrete implementation 1 
}; 

class Concrete2 : public Base 
{ 
    // concrete implementation 2 
}; 

Base * Base::construct(int aType) 
{ 
    switch(aType) 
    { 
     case 1: 
      return (Base*) new Concrete1(); 
     case 2: 
      return (Base*) new Concreate2(); 
    } 
} 
関連する問題