Index: trunk/ab5.0/abdev/BasicCompiler_Common/src/Class.cpp
===================================================================
--- trunk/ab5.0/abdev/BasicCompiler_Common/src/Class.cpp	(revision 559)
+++ trunk/ab5.0/abdev/BasicCompiler_Common/src/Class.cpp	(revision 560)
@@ -183,74 +183,4 @@
 
 	return true;
-}
-
-void CClass::Implements( const CClass &interfaceClass, const Types &actualTypeParameters, std::vector<DynamicMethod::OverrideResult> &overrideResults )
-{
-	::Interface *pDestInterface = new ::Interface( &interfaceClass, actualTypeParameters );
-
-	interfaces.push_back( pDestInterface );
-
-
-	/////////////////////////////////////////////////////////////////
-	// 基底クラスのメソッドからインターフェイスメソッドを再実装する
-	/////////////////////////////////////////////////////////////////
-	BOOST_FOREACH( CMethod *pMethod, GetDynamicMethods() )
-	{
-		DynamicMethod *pMethodForOverride = pDestInterface->GetDynamicMethods().FindForOverride( pDestInterface->GetActualTypeParameters(), &pMethod->GetUserProc() );
-		if( pMethodForOverride )
-		{
-			DynamicMethod::OverrideResult result;
-			result.enumType = pMethodForOverride->Override( &pMethod->GetUserProc(), pMethod->GetAccessibility(), false );
-			result.pMethod = pMethod;
-			overrideResults.push_back( result );
-
-			// 実装元になるメソッドは呼び出し不可にしておく（オーバーロードの解決から除外する）
-			pMethod->SetNotUseMark( true );
-		}
-	}
-
-
-	/////////////////////////////////////////////////////////////////
-	// キャストメソッドを追加（内部コードは自動生成すること）
-	/////////////////////////////////////////////////////////////////
-	if( interfaceClass.IsInterface() )
-	{
-		// Function Operator() As ITest
-
-		char methodName[255] = { 1, ESC_OPERATOR, CALC_AS, '\0' };
-
-		//関数ハッシュへ登録
-		UserProc *pUserProc = new UserProc(
-			NamespaceScopes(),
-			NamespaceScopesCollection(),
-			methodName,
-			Procedure::Function,
-			false,
-			false,
-			false );
-		pUserProc->SetParentClass( this );
-
-		Parameters params;
-		params.push_back( new Parameter( "_System_LocalThis", Type( DEF_PTR_VOID ) ) );
-		pUserProc->SetRealParams( params );
-
-		pUserProc->SetReturnType( Type( DEF_OBJECT, interfaceClass ) );
-		pUserProc->_paramStr = "";
-		pUserProc->Using();
-		compiler.GetObjectModule().meta.GetUserProcs().Insert( pUserProc, -1 );
-
-		LexicalAnalyzer::AddMethod(this,
-			pUserProc,
-			Prototype::Public,
-			0,
-			false,			// isConst
-			false,			// isAbstract
-			false,			// isVirtual
-			false,			// isOverride
-			"",
-			true,			// isAutoGeneration
-			-1
-		);
-	}
 }
 
Index: trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp
===================================================================
--- trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp	(revision 559)
+++ trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp	(revision 560)
@@ -408,5 +408,5 @@
 }
 
-bool LexicalAnalyzer::Inherits( CClass &currentClass, const char *inheritNames, int nowLine ){
+bool LexicalAnalyzer::Inherits( CClass &_class, const char *inheritNames, int nowLine ){
 	int i = 0;
 	bool isInheritsClass = false;
@@ -462,5 +462,5 @@
 			}
 
-			if( !currentClass.InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){
+			if( !_class.InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){
 				return false;
 			}
@@ -495,5 +495,5 @@
 
 		// クラスを一つも継承していないとき
-		if( !currentClass.InheritsClass( *pObjectClass, Types(), nowLine ) ){
+		if( !_class.InheritsClass( *pObjectClass, Types(), nowLine ) ){
 			return false;
 		}
@@ -503,5 +503,75 @@
 }
 
-bool LexicalAnalyzer::Implements( CClass &currentClass, const char *interfaceNames, int nowLine )
+void LexicalAnalyzer::Implements( CClass &_class, Interface *pInterface, std::vector<DynamicMethod::OverrideResult> &overrideResults )
+{
+	_class.AddInterface( pInterface );
+
+
+	/////////////////////////////////////////////////////////////////
+	// 基底クラスのメソッドからインターフェイスメソッドを再実装する
+	/////////////////////////////////////////////////////////////////
+	BOOST_FOREACH( CMethod *pMethod, _class.GetDynamicMethods() )
+	{
+		DynamicMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pInterface->GetActualTypeParameters(), &pMethod->GetUserProc() );
+		if( pMethodForOverride )
+		{
+			DynamicMethod::OverrideResult result;
+			result.enumType = pMethodForOverride->Override( &pMethod->GetUserProc(), pMethod->GetAccessibility(), false );
+			result.pMethod = pMethod;
+			overrideResults.push_back( result );
+
+			// 実装元になるメソッドは呼び出し不可にしておく（オーバーロードの解決から除外する）
+			pMethod->SetNotUseMark( true );
+		}
+	}
+
+
+	/////////////////////////////////////////////////////////////////
+	// キャストメソッドを追加（内部コードは自動生成すること）
+	// ※COMインターフェイスは除外すること
+	/////////////////////////////////////////////////////////////////
+	if( pInterface->GetClass().IsInterface() )
+	{
+		// Function Operator() As ITest
+
+		char methodName[255] = { 1, ESC_OPERATOR, CALC_AS, '\0' };
+
+		//関数ハッシュへ登録
+		UserProc *pUserProc = new UserProc(
+			NamespaceScopes(),
+			NamespaceScopesCollection(),
+			methodName,
+			Procedure::Function,
+			false,
+			false,
+			false );
+		pUserProc->SetParentClass( &_class );
+
+		Parameters params;
+		params.push_back( new Parameter( "_System_LocalThis", Type( DEF_PTR_VOID ) ) );
+		pUserProc->SetRealParams( params );
+
+		pUserProc->SetReturnType( Type( DEF_OBJECT, pInterface->GetClass() ) );
+		pUserProc->_paramStr = "";
+		pUserProc->Using();
+		compiler.GetObjectModule().meta.GetUserProcs().Insert( pUserProc, -1 );
+
+		LexicalAnalyzer::AddMethod(
+			&_class,
+			pUserProc,
+			Prototype::Public,
+			0,
+			false,			// isConst
+			false,			// isAbstract
+			false,			// isVirtual
+			false,			// isOverride
+			"",
+			true,			// isAutoGeneration
+			-1
+		);
+	}
+}
+
+bool LexicalAnalyzer::Implements( CClass &_class, const char *interfaceNames, int nowLine )
 {
 	Jenga::Common::Strings paramStrs;
@@ -541,5 +611,9 @@
 			// インターフェイスを継承する
 			std::vector<DynamicMethod::OverrideResult> overrideResults;
-			currentClass.Implements( *pInterfaceClass, actualTypeParameters, overrideResults );
+			Implements(
+				_class,
+				new ::Interface( pInterfaceClass, actualTypeParameters ),
+				overrideResults
+			);
 
 			// エラーチェック
