killPrivateFlag = false,\r
traits = null,\r
_slice = Array.prototype.slice;\r
- \r
- function copyArray( list ){\r
- //return _slice.call( list, 0 );\r
- var i = list.length, ret = [];\r
- for( ; i; ){\r
- ret[ --i ] = list[ i ];\r
- };\r
- return ret;\r
- };\r
\r
/* サブクラスを作るメソッド \r
* var subClass = superClass.inherits( ... ) \r
* http://d.hatena.ne.jp/m-hiyama/20051018/1129605002\r
*/\r
function inherits( /* displayName, classSetting, opt_PrivateClass, props */ ){\r
- var args = copyArray( arguments ),\r
+ var args = X.copyArray( arguments ),\r
params = [],\r
Super = this,\r
superDef = X.Class._getClassDef( Super ),\r
classSetting,\r
opt_super,\r
klass, def;\r
- if( superDef.Final === true ) X.Notification.critical( 'X.Class inherits, Class is final!' );\r
+ if( superDef.Final ) X.Notification.critical( 'X.Class inherits, Class is final!' );\r
\r
- if( X.Type.isString( displayName ) === true ){\r
+ // サブクラス名\r
+ if( X.Type.isString( displayName ) ){\r
args.shift();\r
} else {\r
displayName = 'SubClass of ' + superDef.displayName;\r
};\r
params.push( displayName );\r
\r
+ // サブクラス設定\r
classSetting = args[ 0 ];\r
- if( X.Type.isNumber( classSetting ) === true ){\r
- if( superDef.isPrivate === true ) classSetting = classSetting | X.Class.PRIVATE_DATA;\r
- opt_super = !!( classSetting & X.Class.SUPER_ACCESS );\r
- params.push( classSetting );\r
+ if( X.Type.isNumber( classSetting ) ){\r
args.shift();\r
+ } else {\r
+ classSetting = superDef.setting;\r
};\r
+ if( superDef.isPrivate ) classSetting = classSetting | X.Class.PRIVATE_DATA;\r
+ opt_super = !!( classSetting & X.Class.SUPER_ACCESS );\r
+ params.push( classSetting );\r
+\r
+ // サブクラスのシャドウ\r
if( X.Class._getClass( args[ 0 ] ) ){\r
params.push( args.shift() );\r
} else\r
if( superDef.privateClass ){\r
params.push( superDef.privateClass );\r
};\r
- params.push( args[ 0 ] ); /* props */\r
+ params.push( args[ 0 ] ); /* props サブクラスでは未定義でも可 */\r
+ \r
+ // 継承クラスの作成\r
Super.__new = null;\r
traits = new Super();\r
Super.__new = C;\r
- klass = X.Class.create.apply( null, params );\r
+ klass = X.Class.create.apply( X.Class, params );\r
traits = null;\r
+ \r
+ // 継承用プロパティを控える\r
if( opt_super === true ){\r
def = X.Class._getClassDef( klass );\r
def.Super = Super;\r
def.SuperProto = Super.prototype;\r
def.SuperConstructor = superDef[ CONSTRUCTOR ];\r
};\r
+ \r
return klass;\r
};\r
\r
SUPER_ACCESS : 8,\r
PRIVATE_DATA : 16,\r
create : function( /* displayName, classSetting, opt_PrivateClass, props */ ){\r
- var args = copyArray( arguments ),\r
+ var args = X.copyArray( arguments ),\r
displayName = args[ 0 ],\r
classSetting,\r
opt_pool, opt_abstract, opt_final, opt_private,\r
classDef.displayName = displayName;\r
args.shift();\r
};\r
- classSetting = args[ 0 ];\r
- if( X.Type.isNumber( classSetting ) === true ){\r
+ \r
+ // クラス設定\r
+ classDef.setting = classSetting = args[ 0 ];\r
+ if( X.Type.isNumber( classSetting ) ){\r
opt_pool = !!( classSetting & X.Class.POOL_OBJECT );\r
opt_abstract = !!( classSetting & X.Class.ABSTRACT );\r
opt_final = !!( classSetting & X.Class.FINAL );\r
opt_private = !!( classSetting & X.Class.PRIVATE_DATA );\r
- if( opt_final === true && opt_abstract === true ){\r
+ if( opt_final && opt_abstract ){\r
X.Notification.critical( 'final & Abstract!' );\r
return;\r
- }; \r
+ }; \r
args.shift();\r
+ } else {\r
+ classDef.setting = 0;\r
};\r
\r
+ // シャドウクラス\r
if( PRIVATE_CLASS_LIST.indexOf( args[ 0 ] ) !== -1 ){\r
privateDef = X.Class._getClassDef( args[ 0 ] );\r
if( privateDef.isPrivate !== true ){\r
};\r
classDef.privateClass = args.shift();\r
};\r
- props = args[ 0 ];\r
- if( props === null || X.Type.isObject( props ) === false ){\r
- X.Notification.critical( 'No Class Def!' );\r
- return;\r
- };\r
\r
- if( props[ CONSTRUCTOR ] && X.Type.isFunction( props[ CONSTRUCTOR ] ) === true ){\r
+ // インスタンスのメンバー\r
+ props = args[ 0 ];\r
+ if( props === null || !X.Type.isObject( props ) ){\r
+ // サブクラスの場合、クラス定義の上書きがなくても作成可能\r
+ if( !traits ){\r
+ X.Notification.critical( 'No Class Def!' );\r
+ return; \r
+ };\r
+ props = {};\r
+ } else\r
+ if( props[ CONSTRUCTOR ] && X.Type.isFunction( props[ CONSTRUCTOR ] ) ){\r
classDef[ CONSTRUCTOR ] = props[ CONSTRUCTOR ];\r
};\r
\r
if( PRIVATE_DEF_LIST.indexOf( KlassOrInstance ) !== -1 ) return KlassOrInstance;\r
},\r
_newPrivate : function( /* instance, args */ ){\r
- var args = copyArray( arguments ),\r
+ var args = X.copyArray( arguments ),\r
user = args.shift(),\r
def = X.Class._getClassDef( user ),\r
privateClass = def.privateClass,\r