Index: trunk/abdev/BasicCompiler_Common/src/Class.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/src/Class.cpp	(revision 350)
+++ trunk/abdev/BasicCompiler_Common/src/Class.cpp	(revision 351)
@@ -382,4 +382,10 @@
 	SetSuperClassActualTypeParameters( actualTypeParameters );
 
+	// インターフェイスを引き継ぐ
+	BOOST_FOREACH( ::Interface *pInterface, inheritsClass.GetInterfaces() )
+	{
+		interfaces.push_back( new ::Interface( *pInterface ) );
+	}
+
 	return true;
 }
@@ -447,7 +453,25 @@
 	}
 
-	interfaces.push_back( new ::Interface( &interfaceClass ) );
-
+	::Interface *pDestInterface = new ::Interface( &interfaceClass );
+
+	interfaces.push_back( pDestInterface );
+
+
+	/////////////////////////////////////////////////////////////////
+	// 基底クラスのメソッドからインターフェイスメソッドを再実する
+	/////////////////////////////////////////////////////////////////
+	BOOST_FOREACH( CMethod *pMethod, GetDynamicMethods() )
+	{
+		CMethod *pMethodForOverride = pDestInterface->GetDynamicMethods().FindForOverride( &pMethod->GetUserProc() );
+		if( pMethodForOverride )
+		{
+			pMethodForOverride->Override( &pMethod->GetUserProc(), pMethod->GetAccessibility(), false );
+		}
+	}
+
+
+	/////////////////////////////////////////////////////////////////
 	// キャストメソッドを追加（内部コードは自動生成すること）
+	/////////////////////////////////////////////////////////////////
 	{
 		// Function Operator() As ITest
@@ -474,4 +498,5 @@
 	}
 
+
 	return true;
 }
@@ -600,16 +625,14 @@
 
 	//メソッド
-	BOOST_FOREACH( const CMethod *pMethod, pobj_c->GetDynamicMethods() ){
+	BOOST_FOREACH( const CMethod *pMethod, pobj_c->GetDynamicMethods() )
+	{
 		//基底クラスと重複する場合はオーバーライドを行う
 		if( pMethod->GetInheritsClassPtr() ) continue;
 
-		if( pMethod->GetUserProc().GetName() == temporary ){
-			if( pMethod->GetUserProc().Params().Equals( pUserProc->Params() )
-				&& pMethod->GetUserProc().ReturnType().Equals( pUserProc->ReturnType() ) )
-			{
-				//関数名、パラメータ、戻り値が合致したとき
-				SetError(15,pUserProc->GetName().c_str(),nowLine);
-				return;
-			}
+		if( pMethod->GetUserProc().IsEqualForOverride( pUserProc ) )
+		{
+			//関数名、パラメータ、戻り値が合致したとき
+			SetError(15,pUserProc->GetName().c_str(),nowLine);
+			return;
 		}
 	}
@@ -619,11 +642,9 @@
 
 	// メソッドのオーバーライド
-	if( pobj_c->GetDynamicMethods().Override( pUserProc, accessibility ) )
-	{
-		// オーバーライドが行われた場合
-		if( !isOverride )
-		{
-			SetError(127,NULL,nowLine);
-		}
+	CMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pUserProc );
+	if( pMethodForOverride )
+	{
+		pMethodForOverride->Override( pUserProc, accessibility, isOverride );
+		pUserProc->SetMethod( pMethodForOverride );
 		return;
 	}
@@ -633,11 +654,9 @@
 		BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() )
 		{
-			if( pInterface->GetDynamicMethods().Override( pUserProc, accessibility ) )
+			CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pUserProc );
+			if( pMethodForOverride )
 			{
-				// オーバーライドが行われた場合
-				if( !isOverride )
-				{
-					SetError(127,NULL,nowLine);
-				}
+				pMethodForOverride->Override( pUserProc, accessibility, isOverride );
+				pUserProc->SetMethod( pMethodForOverride );
 				return;
 			}
@@ -1026,4 +1045,16 @@
 			if(pMethod->IsAbstract()){
 				return true;
+			}
+		}
+	}
+
+	// インターフェイスのvtbl
+	BOOST_FOREACH( const ::Interface *pInterface, interfaces )
+	{
+		BOOST_FOREACH( const CMethod *pMethod, pInterface->GetDynamicMethods() ){
+			if(pMethod->IsVirtual()){
+				if(pMethod->IsAbstract()){
+					return true;
+				}
 			}
 		}
@@ -2021,5 +2052,7 @@
 		if( !pStringClass )
 		{
-			SmoothieException::Throw();
+			SetError(400, "System.String", cp);
+			static CClass dummy;
+			return &dummy;
 		}
 		return pStringClass;
@@ -2035,5 +2068,7 @@
 		if( !pObjectClass )
 		{
-			SmoothieException::Throw();
+			SetError(400, "System.Object", cp);
+			static CClass dummy;
+			return &dummy;
 		}
 		return pObjectClass;
@@ -2049,5 +2084,7 @@
 		if( !pInterfaceInfo )
 		{
-			SmoothieException::Throw();
+			SetError(400, "ActiveBasic.Core.InterfaceInfo", cp);
+			static CClass dummy;
+			return &dummy;
 		}
 		return pInterfaceInfo;
