雪原xy 发表于 2018-12-20 22:47:09

求大神教我:有关继承,复合,方法重载的练习疑难解答!!很好挣的65银子!!

我是一个菜鸟,最近在学习as3复合与继承,想设计一个小练习,怎么也不能达到我想要的结果,修改了无数次!
下图是我画的一个框架图,希望你能看明白!


雪原xy 发表于 2018-12-20 22:58:42

遇到的难题如下:
1,复合的几个子类属性都是internal,在文档类里无法访问,
2,复合类的方法重载返回类型是父类,但返回子类1时,添加的属性丢失。
3,调用用类2的方法时,编译老是出错!
这三条是主要问题,希望大神能帮我写一个实例,不要太复杂,否则我看不懂!!谢谢各位了!
在练习板块中有我做的一个例子,最好能根据那个例子修改!!!谢谢您了!!

TKCB 发表于 2018-12-20 23:16:19

看不懂你的关系图~~

雪原xy 发表于 2018-12-21 06:54:50

本帖最后由 雪原xy 于 2018-12-21 09:52 编辑

TKCB 发表于 2018-12-20 23:16
看不懂你的关系图~~
我举个例子吧:
有一个父类:笔,
它有两个子类:一个是铅笔,一个是橡皮,
然后把橡皮作为一个属性复合到铅笔里;
即,铅笔是笔的子类,但比笔多了一个橡皮的属性。
然后把笔和铅笔复合到另一个类中:盒子。
盒子里有一个方法,可以根据不同的参数,选择使用笔还是铅笔,
以上四个类在同一个包中,方法和属性共享!
最后创建一个文档类,只创建盒子类的实例

然后可以调用所有类的属性和方法!

TKCB 发表于 2018-12-21 07:37:02

本帖最后由 TKCB 于 2018-12-21 08:22 编辑

雪原xy 发表于 2018-12-21 06:54
我举个例子吧:
有一个父类:笔,
它有两个子类:一个是铅笔,一个是橡皮,

设计本身有问题。。
整个逻辑大概应该是这样。

有一个抽象类(或接口)笔。
有两个类实现了抽象类(或接口),也称作父类。
一个是铅笔,一个是橡皮(应该叫做修复笔)。

然后有一个文具盒类,需要铅笔或者橡皮就问文具盒要。
文具盒就会给你一个铅笔或者橡皮。
用完之后按理说扔掉即可,因为这个文具盒应该是神奇的文具盒,里面装了用不尽的铅笔和橡皮。(因为可能很多地方都同时需要铅笔和橡皮)

当然其实程序未必完全按照我的思路,每一个程序设计都是按照需求和功能要求而设计的。水平高的设计好一些,水平低的设计差一些。

再回过头来看,你这个设计需求就是文具盒里面装了各种工具,需要就从文具盒拿(文具盒采用的是复合工具的形式),这样每一个工具都有固定数量,看你复合几个对象了。
文具盒不应该只装笔,还可以装更多工具。
例如:
1. 笔是抽象类(或接口),实现类有铅笔,中性笔,油笔,钢笔,水彩笔等等。
2. 尺子是抽象类(或接口),实现类有直尺,钢尺,三角尺等等。
3. 修复工具是抽象类(或接口),实现类有橡皮,修正液,改正纸等等。

有时候会把一个功能单独抽出来,而不是作为一个父类(抽象类或接口)。
例如,尺子的测量功能,可以在任何地方使用,比如手机上面也有测量app,但是手机绝对不能划分为尺子。
也就是测量功能作为一个功能模块,可以复合在任何类中。

再说一下,其实继承,复合,抽象类,接口,变量,函数,静态成员,类对象,循环,判断等等,这些都是程序设计架构的功能和技巧或方法。
就像条条道路通罗马一样,对于公司来说实现功能就是OK的,但是好的设计需要经验和编程功力,不是用继承就好,不是用复合就好,而是合理的恰当的使用每个技巧。(这个谁也说不好,因为没有绝对)

说了一大堆,,不啰嗦了,自己体会吧。

雪原xy 发表于 2018-12-21 09:41:23

本帖最后由 雪原xy 于 2018-12-21 09:49 编辑

TKCB 发表于 2018-12-21 07:37
设计本身有问题。。
整个逻辑大概应该是这样。


前半部分就是我的想法,后面就看不懂了,抽象类什么的实在不懂!

TKCB 发表于 2018-12-21 09:47:24

雪原xy 发表于 2018-12-21 09:41
前半部分就是我的想法,后面就看不懂了,抽象类什么的实在不懂!

慢慢学,会懂的~~

雪原xy 发表于 2018-12-21 09:53:59

下图中的内容能实现吗?

雪原xy 发表于 2018-12-22 18:15:09

本帖最后由 雪原xy 于 2018-12-22 18:37 编辑

自己做了一个练习,有大神给我点评一下吗?//定义一个复合类,Box:从中可以取出不同的笔;
package son{      

public class Box      {               

var nam:String;            

   var _pencil:Pencil;               

var _rubber:Rubber;               

public var _pm:Memory;               

public var _rm:Memory;               

public function Box(na:String)            

    {                     

nam = na;                     

initparts();            

}            
//一个可以重载的方法;
    public function magicpen(...mag)      

         {                     

if (mag.length == 1)                        {                              

if (mag is String)                              {                           

             write(mag);                              }                              

if (mag == 1)                              {                                       

rubber();                              }                        }                  


    else                        {                        

       trace("请输入正确的参数!谢谢!");                     

   }                }            

    private function initparts()                {                  

    _pencil=new Pencil();                     

_rubber=new Rubber();                        

_pm=new Memory();                  

    _rm=new Memory();                }         

       private function write(e:String)                {                     

_pencil.write(e);                  

   _pm.memory.push(_pencil.writein);                  

   _pm.t++;                }         

   private function rubber()         

   {                     

   if (_pm.memory.length == 1)                        {                              

trace(_pm.memory);                           

   _rm.t++;                        }                        

else                        {                              

_rubber.write(_pm.memory);                              

_rm.memory.push(_rubber.writein);                           

   _pm.memory.pop();                              

_pm.t--;                        

      _rm.t++;                        }                }      }}
//定义一个父类
Pen;package son{      class Pen      {         

      var writein:String = "什么都没有!";               

function write(e:String)                {                     

writein = e;                }      }}
//定义一个存储类
Memorypackage son{      class Memory      {         

   public var memory:Array = ["什么都没有"];
//用来存储写入的内容;               

public var t:int = 0;//用来存储写入的次数;
      }}
//定义一个子类
Rubber;package son{      class Rubber extends Pen      {            

    override function write(e:String)                {               

       writein = e;   

                  trace("这次擦除的是:"+e);                }      }}
//文档类
package {      

import flash.display.Sprite;   

   import son.Box;   

   public class doc extends Sprite      {               

var _box:Box = new Box("魔盒");         

      public function doc()                {                  

      init();                }            

    function init()                {                  

    _box.magicpen(12);                  

      _box.magicpen("我");                     

_box.magicpen("是");                  

   _box.magicpen("中");                     

_box.magicpen("国");                        

_box.magicpen("人");                     

_box.magicpen("?");               

         _box.magicpen(1);                  

   trace("您共写入:"+_box._pm.t+"次,内容是:"+_box._pm.memory);                  

      trace("您共擦除了:"+_box._rm.t+"次,内容是:"+_box._rm.memory);            

    }      }}

雪原xy 发表于 2018-12-22 18:41:24

在手机里写的,复制到这里有点乱!{:1_115:}
有耐心的大神给我看看吗?
页: [1]
查看完整版本: 求大神教我:有关继承,复合,方法重载的练习疑难解答!!很好挣的65银子!!

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)