[flex] 初学自造控件,"继承"和"组装"的抉择及困惑

TonyLian 2008-12-04
我想自造一个控件,他是继承自谋一控件,又在其中加上另一控件。
具体说,就是一个DataGrid下面加一些Button,做成一个支持翻页的Grid(前一页、下一页 等)

我希望这个新控件MyDataGrid是继承自DataGrid的,而不希望是在一个VBox里上面放一个DataGrid,下面放一排按钮。

现在的问题是,采用继承的方法,该如何让DataGrid给下面的一排按钮腾出一些空间呢?

我现在只能让按钮“飘”在DataGrid上,或伸出去,压在MyDataGrid下面的其他控件上面(DataGrid的下边缘直接接着其他控件)

不希望是在一个VBox里上面放一个DataGrid,下面放一排按钮的原因:
我希望MyDataGrid能直接点取出DataGrid的原有属性和方法。
myDataGrid.dataProvider = XXX;   而不是   myDataGrid.dataGrid.dataProvider = XXX;
这正是“继承”和“组合”的意义所在。

举个例子:汽车是由一些零部件组装而成的,它不是继承自某一零部件,即使最重要的发动机。他是组装。
所以当我们发动汽车时,“发动汽车”其实只是我们人的一种偷懒或是习惯性的说法,严格来说应该是“发动汽车的发动机”,即  汽车.发动机.发动();

我们将一辆普通汽车改装成赛车时(加个绕流板),情况就变了,这次是继承了。赛车也是汽车(白马也是马)。
赛车的车身颜色(假定为单色的)是继承自汽车的属性,我们可以通过   赛车.颜色  来得知,显然不是  赛车.汽车.颜色

这就是我想要 myDataGrid.dataProvider = XXX;   而不是   myDataGrid.dataGrid.dataProvider = XXX;
的形象比喻。

再形象地比喻一下我遇到的问题,就是:我这个绕流板没法挂接到车屁股上(无法出车身三维的尺寸)
要么缩到后备箱里,要么出去飞到了后面一辆车的引擎盖上!!

欢迎有自造控件经验的TX一起讨论
frogfool 2008-12-08
1 inheritance

2
public class MyDataGrid extends DataGrid {
   private var pagination:Pagination;
    override protected function createChildren():void
    {
if (!pagination){
	    		// We're using our custom ViewTabBar class instead of TabBar
				pagination = new Pagination();
				pagination.addEventListener(...);
				
				rawChildren.addChild(pagination);		
			}
    }
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
	    {
	        super.updateDisplayList(unscaledWidth, unscaledHeight);
	        
	        var bm:EdgeMetrics = borderMetrics;
            pagination.move(bm.left,unscaledHeight- pagination.height);
     	}
override public function get viewMetrics():EdgeMetrics
        {
            var vm:EdgeMetrics = super.viewMetrics;
           	vm.bottom += pagination.getExplicitOrMeasuredHeight();
            return vm;
        }
}

frogfool 2008-12-08
use
rawChildren.addChild(pagination);
instead of
this.addChild(pagination);
Global site tag (gtag.js) - Google Analytics