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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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;
Note: See TracChangeset for help on using the changeset viewer.