教學(xué)精品3天學(xué)透Actionscript第二天_第1頁
教學(xué)精品3天學(xué)透Actionscript第二天_第2頁
教學(xué)精品3天學(xué)透Actionscript第二天_第3頁
教學(xué)精品3天學(xué)透Actionscript第二天_第4頁
教學(xué)精品3天學(xué)透Actionscript第二天_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、教學(xué)精品 3天學(xué)透Actionscript 第二天5.多態(tài)(Polymorphism)5.1多態(tài)的概念面向?qū)ο蟮娜筇匦裕悍庋b、繼承、多態(tài)。從一定角度來看,封裝和繼承幾乎都是為多態(tài)而準(zhǔn)備的。這是我們最后一個概念,也是最重要的知識點。多態(tài)的定義:指允許不同類的對象對同一消息做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式。(發(fā)送消息就是函數(shù)調(diào)用)實現(xiàn)多態(tài)的技術(shù)稱為:動態(tài)綁定(dynamic binding),是指在執(zhí)行期間判斷所引用對象的實際類型,根據(jù)其實際的類型調(diào)用其相應(yīng)的方法。多態(tài)的作用:消除類型之間的耦合關(guān)系?,F(xiàn)實中,關(guān)于多態(tài)的例子不勝枚舉。比方說按下F1鍵這個動作,如果

2、當(dāng)前在Flash界面下彈出的就是AS 3的幫助文檔;如果當(dāng)前在Word下彈出的就是Word幫助;在Windows下彈出的就是Windows幫助和支持。同一個事件發(fā)生在不同的對象上會產(chǎn)生不同的結(jié)果。下面是多態(tài)存在的三個必要條件,要求大家做夢時都能背出來!5.2多態(tài)存在的三個必要條件一、要有繼承;二、要有重寫;三、父類引用指向子類對象。5.3 TestPolymoph.as-多態(tài)的應(yīng)用,體會多態(tài)帶來的好處packagepublic class TestPolymophpublic function TestPolymoph()var cat:Cat=new Cat(MiMi);var lily:L

3、ady=new Lady(cat);/var dog:Dog=new Dog(DouDou);/var lucy:Lady=new Lady(dog);lady.myPetEnjoy();class Animalprivate var name:String;function Animal(name:String)=name;public function enjoy():voidtrace(call.);class Cat extends Animalfunction Cat(name:String)super(name);override public function

4、enjoy():voidtrace(Miao Miao.);class Dog extends Animalfunction Dog(name:String)super(name);override public function enjoy():voidtrace(Wang Wang.);/假設(shè)又添加了一個新的類Bird class Bird extends Animalfunction Bird(name:String)super(name);override public function enjoy():voidtrace(JiJi ZhaZha);class Ladyprivate

5、var pet:Animal;function Lady(pet:Animal)this.pet=pet;public function myPetEnjoy():void/試想如果沒有多態(tài)/if(pet is Cat)Cat.enjoy()/if(pet is Dog)Dog.enjoy()/if(pet is Bird)Bird.enjoy()pet.enjoy();首先,定義Animal類包括:一個name屬性(動物的名字),一個enjoy()方法(小動物玩兒高興了就會叫)。接下來,定義Cat,Dog類它們都繼承了Animal這個類,通過在構(gòu)造函數(shù)中調(diào)用父類的構(gòu)造函數(shù)可以設(shè)置name這個

6、屬性。貓應(yīng)該是喵喵叫的,因此對于父類的enjoy()方法進(jìn)行重寫(override),打印出的叫聲為Miao Maio。Dog也是如此,重寫enjoy方法,叫聲為Wang Wang。再定義一個Lady類,設(shè)置一個情節(jié):假設(shè)這個Lady是一個小女孩兒,她可以去養(yǎng)一只寵物,這個小動物可能是Cat,Dog,或是Animal的子類。在Lady類中設(shè)計一個成員變量pet,存放著寵物的引用。具體是哪類動物不清楚,但肯定是Animal的子類,因此pet的類型為Animal,即pet:Animal。注意這是父類引用,用它來指向子類對象。最后在Lady類里面有一個成員函數(shù)myPetEnjoy(),這個方法中只有

7、一句pet.enjoy(),調(diào)用pet的enjoy()方法?,F(xiàn)在來看測試類。new出來一只Cat,new出來一個Lady,將Cat的對象傳給Lady?,F(xiàn)在Lady中的成員變量應(yīng)該是pet:Animal=new Cat(MiMi)。下面,調(diào)用lady.myPetEnjoy()方法,實際就是在調(diào)用pet.enjoy(),打印出Miao Miao。pet的類型明明是Animal,但被調(diào)的方法卻是Cat的enjoy(),而非Animal的enjoy(),這就叫動態(tài)綁定-在執(zhí)行期間判斷所引用對象的實際類型,根據(jù)其實際的類型調(diào)用其相應(yīng)的方法。想象一下,如果沒有多態(tài)的話,myPetEnjoy()中方法可能要

8、做這樣的一些判斷:if(pet is Cat)new Cat(c).enjoy()if(pet is Dog)new Dog(d).enjoy()判斷如果pet是Cat類型的話調(diào)用new Cat().enjoy(),如果是Dog的話調(diào)用new Dog().enjoy()。假設(shè)有一天我要傳入一個Bird,那還得手動加上:if(pet is Bird)new Bird(b).enjoy()新加入什么類型的都要重新修改這個方法,這樣的程序可擴展性差。但是現(xiàn)在我們運用了多態(tài),可以隨意地加入任何類型的對象,只要是Animal的子類就可以。例如,var lily:Lady=new Lady(new Bir

9、d(dudu),直接添加進(jìn)去就可以了,不需要修改其它任何地方。這樣就大大提升的代碼的可擴展性,通過這個例子好好體會一下多態(tài)帶來的好處。最后再補充一點,在使用父類引用指向子類對象時,父類型的對象只能調(diào)用是在父類中定義的,如果子類有新的方法,對于父類來說是看不到的。拿我們這個例子來說,如果Animal類不變,在Cat和Dog中都新定義出一個run()方法,這個方法是父類中沒有的。那么這時要使用父類型的對象去調(diào)用子類新添加的方法就不行了。下面看一個這個例子的內(nèi)存圖。5.4 TestPolymoph內(nèi)存分析在內(nèi)存中,一個個方法就是一段段代碼,因此它們被存放在代碼段中。上例中的pet是Animal類型的

10、成員變量,但是它指向的是一個Cat類型的具體對象,同時Cat又是它的子類,并且重寫了enjoy()方法,滿足了多態(tài)存在的三個必要條件。那么當(dāng)調(diào)用pet.enjoy()的時候,調(diào)用的就是實際對象Cat的enjoy()方法,而非引用類型Animal的enjoy()方法。5.5多態(tài)的好處多態(tài)提升了代碼的可擴展性,我們可以在少量修改甚至不修改原有代碼的基礎(chǔ)上,輕松加入新的功能,使代碼更加健壯,易于維護。在設(shè)計模式中對于多態(tài)的應(yīng)用比比皆是,面向?qū)ο笤O(shè)計(OOD)中有一個最根本的原則叫做開放關(guān)閉原則(Open-Closed Principle OCP),意思是指對添加開放,對修改關(guān)閉??纯瓷厦娴睦樱\用

11、了多態(tài)以后我們要添加一個Bird只需要再寫一個Bird類,讓它繼承自Animal,然后new出來一個對象把它傳給lily即可。我們所做的就是添加新的類,而對原來的結(jié)構(gòu)沒有做任何的修改,這樣代碼的可擴展性就非常好了!因為我們遵循了開放-關(guān)閉原則-添加而不是修改。前面這個例子中還有一個地方需要說明,Animal這個類,實際上應(yīng)該定義為一個抽象類,里面的enjoy()方法,事實上不需要實現(xiàn),也沒法實現(xiàn)。想一想,Animal的叫聲?!你能想象出Animal是怎么叫的嗎?顯然,這個方法應(yīng)該定義為一個抽象方法,留給它的子類去實現(xiàn),它自己不需要實現(xiàn),那么一旦這個類中有一個方法抽象的,那么這個類就應(yīng)該定義為抽

12、象類。但是很遺憾AS 3不支持抽象類,因為它沒有abstract關(guān)鍵字。但是抽象類也是一個比較重要的概念,因此下面還要給大家補充一下。5.6抽象類的概念一個類如果只聲明方法而沒有方法的實現(xiàn),則稱為抽象類。含有抽象方法的類必須被聲明為抽象類,抽象類必須被繼承,抽象方法必須被重寫。如果重寫不了,應(yīng)該聲明自己為抽象。抽象類不能被實例化。抽象方法只需聲明,而不需實現(xiàn)。ActionScript 3.0不支持抽象類(abstract),以后肯定會支持的,相信我,那只是時間問題。因此這里只介紹一下抽象類的概念。5.7對象轉(zhuǎn)型(Casting)一個基類類型變量可以指向其子類的對象。一個基類的引用不可以訪問其子

13、類對象新增加的成員(屬性和方法)??梢允褂米兞縤s類名來判斷該引用型變量所指向的對象是否屬于該類或該類的子類。子類的對象可以當(dāng)作基類的對象來使用稱作向上轉(zhuǎn)型(upcasting),反之稱為向下轉(zhuǎn)型(downcasting)。每說到轉(zhuǎn)型,就不得不提到里氏代換原則(LSP)。里氏代換原則說,任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。里氏代換原則是對開放-關(guān)閉原則的補充。里氏代換原則準(zhǔn)確的描述:在一個程序中,將所有類型為A的對象都轉(zhuǎn)型為B的對象,而程序的行為沒有變化,那么類型B是類型A的子類型。比如,假設(shè)有兩個類:Base和Extender,其中Extender是Base的子類。如果一個方法可以接受

14、基類對象b的話:method(b:Base)那么它必然可以接受一個子類對象e,即有method(e)。注意,里氏代換原則反過來不能成立。使用子類對象的地方,不一定能替換成父類對象。向上轉(zhuǎn)型是安全的,可以放心去做。但是在做向下轉(zhuǎn)型,并且對象的具體類型不明確時通常需要用instanceof判斷類型。下面看一個例子TestPolymoph.as:packagepublic class TestCastpublic function TestCast()/-UpCasting-var cat:Cat=new Cat();var dog:Dog=new Dog();var animal:Animal=A

15、nimal(cat);animal.call();animal.sleep();/animal.eat();/不能調(diào)用父類中沒有定義的方法/-DownCasting-if(animal is Cat)cat=Cat(animal);cat.eat();else if(animal is Dog)dog=Dog(animal);dog.eat();class Animalpublic function call():void;public function sleep():void;class Cat extends Animaloverride public function call():v

16、oidtrace(Cat Call);override public function sleep():voidtrace(Cat Sleep);public function eat():voidtrace(Cat Eat);class Dog extends Animaloverride public function call():voidtrace(Dog Call);override public function sleep():voidtrace(Dog Sleep);public function eat():voidtrace(Dog Eat);首先創(chuàng)建Animal類,定義兩

17、個方法call()和sleep(),它的子類Cat和Dog分別重寫了這兩個方法,并且都擴展了出了一個新的方法eat()。來看測試類,new出來一個cat,再將它向上轉(zhuǎn)型animal:Animal=Animal(cat)。由于向上轉(zhuǎn)型是安全的,所以這樣做沒有問題,但是當(dāng)它轉(zhuǎn)型成了父類對象后,就不能再調(diào)用eat()方法了,因為在父類中只有call()和sleep()方法,父類對象不能調(diào)用子類擴展出的新方法。接下來一段代碼是在進(jìn)行向下轉(zhuǎn)型,animal這個對象可以是一個放一個dog也可以放一個cat,當(dāng)這兩種情況都有可能時,進(jìn)行向下轉(zhuǎn)型就要判斷一下當(dāng)然對象到底是哪個類型的,使用is進(jìn)行判斷,看看該對

18、象是不是一個Cat或Dog,如果是Cat就將它向下轉(zhuǎn)型為一個Cat,這樣就可以安全地調(diào)用Cat的eat()方法了。最后再舉一個現(xiàn)實中的例子TestEventCast.as:packageimport flash.display.Sprite;import flash.events.Event;public class TestEventCast extends Spritepublic function TestEventCast()var ball:Sprite=new Sprite();ball.graphics.beginFill(0xff0000);ball.graphics.draw

19、Circle(0,0,50);ball.graphics.endFill();ball.y=150;ball.x=150;addChild(ball);ball.addEventListener(Event.ENTER_FRAME,onEnterFrame);private function onEnterFrame(evt:Event):void/evt.target是Object類型的,需要轉(zhuǎn)型成為實際類型才能使用x屬性var ball:Sprite=Sprite(evt.target);ball.x+=5;構(gòu)造函數(shù)中創(chuàng)建一個Sprite類的對象,并在里面繪制一個圓,加入ENTER_FRA

20、ME偵聽,在onEnterFrame函數(shù)中,var ball:Sprite=Sprite(evt.target)這里我們必須做向上轉(zhuǎn)型,如果不做的話系統(tǒng)會報錯,為什么呢?查看一下幫助文檔,Event類target屬性的實現(xiàn):public function get target():Object。這是一個只讀屬性,它返回的是一個Object類型的對象。由于AS 3是單根繼承的,因此任何一個對象都可以向上轉(zhuǎn)型成Object類型的。因此每次要拿到這個evt.target的時候都要將它向下轉(zhuǎn)型成為該對象的實際類型才能放心使用。6.接口(Interface)6.1接口的概念每次說到接口,我都會想到現(xiàn)在很

21、流行的一句話-三流的企業(yè)賣產(chǎn)品,二流的企業(yè)賣服務(wù),一流的企業(yè)賣標(biāo)準(zhǔn)。接口就是在賣標(biāo)準(zhǔn)。接口是方法聲明的集合,讓不相關(guān)的對象能夠彼此通信。接口是實現(xiàn)多繼承的一種手段。因此這一節(jié)非常重要。接口僅包含一組方法聲明,沒有具體的代碼實現(xiàn)。實現(xiàn)接口的類必須按照接口的定義實現(xiàn)這些方法,因此,實現(xiàn)同一個接口的類都具有這個接口的特征。接口與類的區(qū)別:接口中只能定義成員方法,不能定義成員變量。接口中的方法都是抽象方法(沒有具體實現(xiàn))。6.2依賴倒轉(zhuǎn)原則(Dependence Inversion Principle)如果說開放-關(guān)閉原則是面對對象設(shè)計的目標(biāo),那么依賴倒轉(zhuǎn)原則就是這個面向?qū)ο笤O(shè)計的主要機制。依賴倒轉(zhuǎn)原

22、則講的是:要依賴于抽象,不要依賴于具體。依賴倒轉(zhuǎn)原則的另一種表述是:要針對接口編程,不要針對實現(xiàn)編程。針對接口編程意思就是說,應(yīng)當(dāng)使用接口或抽象類來編程。它強調(diào)一個系統(tǒng)內(nèi)實體間關(guān)系的靈活性。如果設(shè)計者要遵守開放-關(guān)閉原則,那么依賴倒轉(zhuǎn)原則便是達(dá)到此要求的途徑,它是面向?qū)ο笤O(shè)計的核心原則,設(shè)計模式的研究和應(yīng)用均以該原則為指導(dǎo)原則。6.3實現(xiàn)接口的原則在實現(xiàn)接口的類中,實現(xiàn)的方法必須(選自幫助文檔):(1)使用public訪問控制標(biāo)識符。(2)使用與接口方法相同的名稱。(3)擁有相同數(shù)量的參數(shù),每一個參數(shù)的數(shù)據(jù)類型都要與接口方法參數(shù)的數(shù)據(jù)類型相匹配。(4)使用相同的返回類型。6.4 TestInt

23、erFaceAccess.as-實現(xiàn)多個接口packagepublic class TestInterFaceAccesspublic function TestInterFaceAccess()var duck:Duck=new Duck();duck.run(56);duck.fly();interface Runnablefunction run(meter:uint):void;interface Flyablefunction fly():void;class Duck implements Runnable,Flyablepublic function run(meter:uint

24、):voidtrace(I can run+meter+meters);public function fly():voidtrace(I can fly);這個例子很簡單,首先定義兩個接口Runnable和Flyable。Runnable中定義了一個抽象的run()方法,F(xiàn)lyable中定義了一個抽象的fly()方法。我們知道,接口是在定義標(biāo)準(zhǔn),它自己不需要實現(xiàn),具體的實現(xiàn)交給實現(xiàn)該接口的類去完成。Duck類實現(xiàn)(implements)了Runnable和Flyable,因此它必需去實現(xiàn)這兩個接口中定義的所有方法。并且方法名,參數(shù)類型,返回值類型要與接口中定義的完全一致,權(quán)限修飾符必需是pu

25、blic。大家可以試一試其它的訪問權(quán)限,例如,private,internal看看能不能測試通過。結(jié)論是不能,請查看6.3節(jié)實現(xiàn)接口的原則。其實這些結(jié)論大家通過動手實驗就能得出結(jié)論。比如說如果實現(xiàn)了該接口的類的方法權(quán)限不是public或者方法返回值、參數(shù)類型、參數(shù)個數(shù)與接口中定義的不同,是否可以測試通過呢?如果在定義接口時在function前面加入了訪問權(quán)限修飾符,可以不可以以呢?類似這些問題不需要查書或去問別人,自己動手做實驗是最快最高效的學(xué)習(xí)方法,編譯器會告訴你,行還是不行,直接問它就可以了!以上做法都行不通。為了更好地保證接口的實現(xiàn)不出差錯,通常最保險的做法就將該方法復(fù)制(ctrl+c)

26、過來,并在前面加上public,再去實現(xiàn)。6.5接口用法總結(jié)通過接口可以實現(xiàn)不相關(guān)類的相同行為,而不需要考慮這些類之間的層次關(guān)系。(就像人擁有一項本領(lǐng))。通過接口可以指明多個類需要實現(xiàn)的方法。(描述這項本領(lǐng)的共同接口)。通過接口可以了解對象的交互界面,而不需要了解對象所對應(yīng)的類。我們通常所說的繼承廣義來講,它不僅是指extends,還包括implements,回想5.2節(jié)中說到多態(tài)存在的三個必要條件,這里面所說的就廣義的繼承。說得更明確一點就是:要有繼承(或?qū)崿F(xiàn)相同接口),要有重寫(或?qū)崿F(xiàn)接口),父類引用指向子類對象(或接口類型指向?qū)崿F(xiàn)類的對象)。下面來看最后一個知識點,使用接口實現(xiàn)多態(tài)。6.

27、6 TestInterFacePoly.as-接口實現(xiàn)多態(tài)packagepublic class TestInterFacePolypublic function TestInterFacePoly()var cat:Cat=new Cat();var duck:Duck=new Duck();var racing:Racing=new Racing(cat);racing.go();interface Runnablefunction run():void;interface Swimmablefunction swim():void;interface Flyablefunction fl

28、y():void;class Cat implements Runnable,Swimmablepublic function run():voidtrace(Cat run);public function swim():voidtrace(Cat swim);public function climb():voidtrace(Cat Climb);class Duck implements Runnable,Flyablepublic function run():voidtrace(Duck run);public function fly():voidtrace(Duck fly);c

29、lass Racingvar runner:Runnable;public function Racing(r:Runnable)runner=r;public function go():voidrunner.run();使用接口實現(xiàn)多態(tài),和前面通過繼承實現(xiàn)多態(tài)幾乎是相同的,只不過這次是把父類引用改成了接口類型的引用。實現(xiàn)了同一接口的類的對象表示它們都具有這一項相同的能力,當(dāng)我們只關(guān)心某些這項能力,而并不關(guān)心具體對象的類型時,使用多態(tài)可以更好地保證代碼的靈活性,這就是向上抽象的作用。下面來解釋一下這個例子。首先,定義三個接口Runnable(會跑的),Swimmable(會游的),F(xiàn)lyab

30、le(會飛的)。讓Cat類實現(xiàn)Runnable,Swimmable,讓Duck類實現(xiàn)Runnable,Flyable。實現(xiàn)了某個接口就代表擁有了某項(或幾項)技能。Cat類中除了實現(xiàn)這兩個接口之外,它還有自己的climb()方法。在測試類中,創(chuàng)建一個Cat類的對象cat,一個Dog類的對象dog。接下來,加入一個Racing(跑步比賽)類的實例,將cat傳進(jìn)去,賦給runner變量(Runnable接口類型的引用),Racing類的go()方法中調(diào)用了實現(xiàn)了Runnable接口的對象,并調(diào)用它的run()方法,這里就有了多態(tài),動態(tài)綁定到實際對象的run()方法。成員變量runner是Runna

31、ble接口類型的,說明我們只關(guān)心它是能跑的對象(擁有run()方法),具體它是怎么跑的我不管,反正你實現(xiàn)了Runnable接口,就肯定有run()方法,我只要你的run()方法,其它的我不管。注意,在Runnable中只定義run()方法,對于runner來說只能看到Runnable接口里定義的方法,在此接口以外的方法一律看不到,如果要讓runner調(diào)用Cat對象的climb()或swim()方法是行不通的,與5.3節(jié)最后一段說明的道理是一樣的。接口在設(shè)計模式中應(yīng)用廣泛,下面請出策略模式。6.7策略模式(Strategy Pattern)同樣,不直接給出最終的答案,先看下面這個例子:packa

32、gepublic class TestStrategypublic function TestStrategy()var rabbit:Rabbit=new Rabbit();rabbit.run();rabbit.jump();interface Runnablefunction run():void;interface Jumpablefunction jump():void;class Rabbit implements Runnable,Jumpablepublic function run():voidtrace(I can run fast);public function jum

33、p():voidtrace(I can jump 5m);這個例子很簡單,讓Rabbit實現(xiàn)Runnable,Jumpable接口,讓它能跑能跳。現(xiàn)在如果要讓Rabbit跳不起來,那么就要修改它的jump()方法,打印出I cant jump。如果要讓它能跑1000 m,并且還能跨欄,那么還要修改run()方法的實現(xiàn)。還記得OO設(shè)計的最根本原則嗎?開放-關(guān)閉原則-對添加開放,對修改關(guān)閉。下面來看看策略模式是怎樣做到開放-關(guān)閉原則的。以下是TestStrategy.as:interface Runnablefunction run():void;interface Jumpablefunctio

34、n jump():void;class FastRun implements Runnablepublic function run():voidtrace(I can run fast);class JumpHigh implements Jumpablepublic function jump():voidtrace(I can jump 5m);class JumpNoWay implements Jumpablepublic function jump():voidtrace(I cant jump);class Rabbitvar runBehavior:Runnable=new F

35、astRun();var jumpBehavior:Jumpable=new JumpHigh();/new JumpNoWay();public function run()runBehavior.run();public function jump()jumpBehavior.jump();現(xiàn)在Rabbit中加入了兩個成員變量runBehavior,jumpBehavior分別是Runnable和Jumpable類型的引用,又是父類引用(接口)指向子類對象。Rabbit的run和jump直接調(diào)用了runBehavior.run()和jumpBehavior.jump()。而runBehav

36、ior,jumpBehavior指向的是兩個實現(xiàn)了Runnable和Jumpable接口的類FastRun類和JumpHigh類。而在這兩個類中分別實現(xiàn)了Runnable和Jumpable接口,run()和jump()的具體實現(xiàn)被放到FastRun和JumpHigh這兩個類中去了。這樣做有什么好處呢?首先,如果將來的策略發(fā)生了變化讓兔子跳不起來,那么只需要添加一個新的類(策略):JumpNoWay同樣讓它實現(xiàn)Jumpable接口,jump方法中打印出I cant jump,然后將Rabbit類中的new JumpHigh()改為new JumpNoWay()即可,這樣就實現(xiàn)了添加而不是修改的原則,我們只添加了一個新的策略(類),對原來的策略沒有任何修改,最后只是替換了一個策略而以(當(dāng)然這種修改是必要的)。另一個好處是,將來如果要修改JumpHigh的算法,讓它可以跳150米,那么直接去修改JumpHigh里的jump()就

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論