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

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

Location:
trunk/abdev/BasicCompiler_Common/src
Files:
2 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;
  • 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.