Changeset 351 in dev for trunk/abdev/BasicCompiler_Common


Ignore:
Timestamp:
Oct 17, 2007, 3:31:20 AM (17 years ago)
Author:
dai_9181
Message:

インターフェイスメソッドはオーバーライド対象外とした

Location:
trunk/abdev/BasicCompiler_Common
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/error.cpp

    r342 r351  
    216216    if(num==300) lstrcpy(msg,"内部エラー");
    217217
     218    // ベースライブラリ不整合
     219    if( num == 400 )    sprintf( msg, "\"%s\" が存在しません。標準ライブラリの内容が古い可能性があります。", tempKeyWord );
     220
    218221#else
    219222    ////////////////////
  • trunk/abdev/BasicCompiler_Common/include/Method.h

    r347 r351  
    5151    }
    5252
     53    virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier ) = 0;
     54
    5355    virtual bool IsAbstract() const = 0;
    54     virtual void Override() = 0;
     56    virtual void SetAbstractMark( bool isAbstractMark ) = 0;
    5557    virtual bool IsVirtual() const = 0;
    5658    virtual bool IsConst() const = 0;
     
    103105    }
    104106
     107    virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier );
     108
    105109    virtual bool IsAbstract() const
    106110    {
    107111        return isAbstract;
    108112    }
    109     virtual void Override()
    110     {
    111         isAbstract = false;
     113    virtual void SetAbstractMark( bool isAbstract )
     114    {
     115        this->isAbstract = isAbstract;
    112116    }
    113117    virtual bool IsVirtual() const
     
    150154
    151155public:
     156
     157    // コンストラクタ
    152158    StaticMethod( UserProc *pUserProc, Prototype::Accessibility accessibility )
    153159        : CMethod( pUserProc, accessibility )
    154160    {
    155161    }
     162
     163    // コピーコンストラクタ
     164    StaticMethod( const StaticMethod &staticMethod );
     165
     166    // デストラクタ
    156167    StaticMethod()
    157168    {
    158169    }
    159170
     171    virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier ){SetError();return false;}
     172
    160173    virtual bool IsAbstract() const{SetError();return false;}
    161     virtual void Override(){SetError();}
     174    virtual void SetAbstractMark( bool isAbstract ){SetError();}
    162175    virtual bool IsVirtual() const{
    163176        return false;
     
    190203
    191204public:
     205    // コンストラクタ
    192206    Methods();
     207
     208    // コピーコンストラクタ
     209    Methods( const Methods &methods );
     210
     211    // デストラクタ
    193212    ~Methods();
    194213
     
    197216    void AddStatic(UserProc *pUserProc,Prototype::Accessibility accessibility);
    198217
    199     // オーバーライド
    200     bool Override( UserProc *pUserProc, Prototype::Accessibility accessibility );
     218    // オーバーライドのための検索
     219    CMethod *FindForOverride( const UserProc *pUserProc );
    201220
    202221    const CMethod *GetMethodPtr( const UserProc *pUserProc ) const;
  • trunk/abdev/BasicCompiler_Common/include/Procedure.h

    r350 r351  
    220220    }
    221221
     222    // オーバーライド用に関数同士が等しいかどうかをチェックする
     223    bool IsEqualForOverride( const UserProc *pUserProc ) const
     224    {
     225        if( this->GetName() == pUserProc->GetName()                     // 名前空間及び名前が等しい
     226            && this->Params().Equals( pUserProc->Params() )             // パラメータが等しい
     227            && this->returnType.Equals( pUserProc->returnType ) )       // 戻り値が等しい
     228        {
     229            return true;
     230        }
     231        return false;
     232    }
     233
    222234    bool IsMacro() const
    223235    {
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r350 r351  
    382382    SetSuperClassActualTypeParameters( actualTypeParameters );
    383383
     384    // インターフェイスを引き継ぐ
     385    BOOST_FOREACH( ::Interface *pInterface, inheritsClass.GetInterfaces() )
     386    {
     387        interfaces.push_back( new ::Interface( *pInterface ) );
     388    }
     389
    384390    return true;
    385391}
     
    447453    }
    448454
    449     interfaces.push_back( new ::Interface( &interfaceClass ) );
    450 
     455    ::Interface *pDestInterface = new ::Interface( &interfaceClass );
     456
     457    interfaces.push_back( pDestInterface );
     458
     459
     460    /////////////////////////////////////////////////////////////////
     461    // 基底クラスのメソッドからインターフェイスメソッドを再実する
     462    /////////////////////////////////////////////////////////////////
     463    BOOST_FOREACH( CMethod *pMethod, GetDynamicMethods() )
     464    {
     465        CMethod *pMethodForOverride = pDestInterface->GetDynamicMethods().FindForOverride( &pMethod->GetUserProc() );
     466        if( pMethodForOverride )
     467        {
     468            pMethodForOverride->Override( &pMethod->GetUserProc(), pMethod->GetAccessibility(), false );
     469        }
     470    }
     471
     472
     473    /////////////////////////////////////////////////////////////////
    451474    // キャストメソッドを追加(内部コードは自動生成すること)
     475    /////////////////////////////////////////////////////////////////
    452476    {
    453477        // Function Operator() As ITest
     
    474498    }
    475499
     500
    476501    return true;
    477502}
     
    600625
    601626    //メソッド
    602     BOOST_FOREACH( const CMethod *pMethod, pobj_c->GetDynamicMethods() ){
     627    BOOST_FOREACH( const CMethod *pMethod, pobj_c->GetDynamicMethods() )
     628    {
    603629        //基底クラスと重複する場合はオーバーライドを行う
    604630        if( pMethod->GetInheritsClassPtr() ) continue;
    605631
    606         if( pMethod->GetUserProc().GetName() == temporary ){
    607             if( pMethod->GetUserProc().Params().Equals( pUserProc->Params() )
    608                 && pMethod->GetUserProc().ReturnType().Equals( pUserProc->ReturnType() ) )
    609             {
    610                 //関数名、パラメータ、戻り値が合致したとき
    611                 SetError(15,pUserProc->GetName().c_str(),nowLine);
    612                 return;
    613             }
     632        if( pMethod->GetUserProc().IsEqualForOverride( pUserProc ) )
     633        {
     634            //関数名、パラメータ、戻り値が合致したとき
     635            SetError(15,pUserProc->GetName().c_str(),nowLine);
     636            return;
    614637        }
    615638    }
     
    619642
    620643    // メソッドのオーバーライド
    621     if( pobj_c->GetDynamicMethods().Override( pUserProc, accessibility ) )
    622     {
    623         // オーバーライドが行われた場合
    624         if( !isOverride )
    625         {
    626             SetError(127,NULL,nowLine);
    627         }
     644    CMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pUserProc );
     645    if( pMethodForOverride )
     646    {
     647        pMethodForOverride->Override( pUserProc, accessibility, isOverride );
     648        pUserProc->SetMethod( pMethodForOverride );
    628649        return;
    629650    }
     
    633654        BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() )
    634655        {
    635             if( pInterface->GetDynamicMethods().Override( pUserProc, accessibility ) )
     656            CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pUserProc );
     657            if( pMethodForOverride )
    636658            {
    637                 // オーバーライドが行われた場合
    638                 if( !isOverride )
    639                 {
    640                     SetError(127,NULL,nowLine);
    641                 }
     659                pMethodForOverride->Override( pUserProc, accessibility, isOverride );
     660                pUserProc->SetMethod( pMethodForOverride );
    642661                return;
    643662            }
     
    10261045            if(pMethod->IsAbstract()){
    10271046                return true;
     1047            }
     1048        }
     1049    }
     1050
     1051    // インターフェイスのvtbl
     1052    BOOST_FOREACH( const ::Interface *pInterface, interfaces )
     1053    {
     1054        BOOST_FOREACH( const CMethod *pMethod, pInterface->GetDynamicMethods() ){
     1055            if(pMethod->IsVirtual()){
     1056                if(pMethod->IsAbstract()){
     1057                    return true;
     1058                }
    10281059            }
    10291060        }
     
    20212052        if( !pStringClass )
    20222053        {
    2023             SmoothieException::Throw();
     2054            SetError(400, "System.String", cp);
     2055            static CClass dummy;
     2056            return &dummy;
    20242057        }
    20252058        return pStringClass;
     
    20352068        if( !pObjectClass )
    20362069        {
    2037             SmoothieException::Throw();
     2070            SetError(400, "System.Object", cp);
     2071            static CClass dummy;
     2072            return &dummy;
    20382073        }
    20392074        return pObjectClass;
     
    20492084        if( !pInterfaceInfo )
    20502085        {
    2051             SmoothieException::Throw();
     2086            SetError(400, "ActiveBasic.Core.InterfaceInfo", cp);
     2087            static CClass dummy;
     2088            return &dummy;
    20522089        }
    20532090        return pInterfaceInfo;
  • trunk/abdev/BasicCompiler_Common/src/Method.cpp

    r347 r351  
    44
    55
     6bool DynamicMethod::Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier )
     7{
     8    if( this->IsVirtual()
     9        && !this->IsAbstract()
     10        && isOverrideModifier == false )
     11    {
     12        // Override修飾子が無い状況で基底クラスの実体メソッドをオーバーライドしようとした
     13        SetError(127,NULL,cp);
     14    }
     15
     16    //メンバ関数を上書き
     17    this->SetUserProcPtr( pUserProc );
     18    this->SetAbstractMark( false );
     19
     20    if( !this->IsVirtual() )
     21    {
     22        // オーバーライドミス
     23        SetError(136,NULL,cp);
     24    }
     25    if(this->GetAccessibility() != accessibility )
     26    {
     27        SetError(128,NULL,cp);
     28    }
     29
     30    return true;
     31}
     32
     33
     34StaticMethod::StaticMethod( const StaticMethod &staticMethod )
     35{
     36    // 静的メソッドがコピーコンストラトされることは想定しない
     37    SetError();
     38}
     39
    640Methods::Methods()
    741{
    842}
     43
     44// コピーコンストラクタ
     45Methods::Methods( const Methods &methods )
     46{
     47    BOOST_FOREACH( CMethod *pMethod, methods )
     48    {
     49        this->push_back( new DynamicMethod( dynamic_cast<DynamicMethod &>(*pMethod) ) );
     50    }
     51}
     52
    953Methods::~Methods()
    1054{
    1155    Methods &methods = *this;
    12     BOOST_FOREACH( CMethod *pMethod, methods ){
     56    BOOST_FOREACH( CMethod *pMethod, methods )
     57    {
    1358        delete pMethod;
    1459    }
     
    2671}
    2772
    28 bool Methods::Override( UserProc *pUserProc, Prototype::Accessibility accessibility )
     73CMethod *Methods::FindForOverride( const UserProc *pUserProc )
    2974{
    3075    //メソッドのオーバーライド
     
    3277    BOOST_FOREACH( CMethod *pMethod, methods )
    3378    {
    34         if( pMethod->GetUserProc().GetName() == pUserProc->GetName() )
     79        if( pMethod->GetUserProc().IsEqualForOverride( pUserProc ) )
    3580        {
    36             if( pMethod->GetUserProc().Params().Equals( pUserProc->Params() )
    37                 && pMethod->GetUserProc().ReturnType().Equals( pUserProc->ReturnType() ) )
    38             {
    39                 //メンバ関数を上書き
    40                 pMethod->SetUserProcPtr( pUserProc );
    41                 pMethod->Override();
    42 
    43                 if( !pMethod->IsVirtual() )
    44                 {
    45                     // オーバーライドミス
    46                     SetError(136,NULL,cp);
    47                 }
    48                 if(pMethod->GetAccessibility() != accessibility )
    49                 {
    50                     SetError(128,NULL,cp);
    51                 }
    52 
    53                 pUserProc->SetMethod( pMethod );
    54                 return true;
    55             }
     81            return pMethod;
    5682        }
    5783    }
    58     return false;
     84    return NULL;
    5985}
    6086
Note: See TracChangeset for help on using the changeset viewer.