Did you have a polymorph of today?

xiaoxiao2021-03-06  96

Did you have a polymorph of today?

Do You Polymorphism Today? [0]

Writen by Allen Lee

-1. Catalog

-1. Catalog 0. Written in front.

0.0 keywords. 0.1 System requirements? ! 0.2 How to read this article? 1. Library Magic Event Book.

1.0 Book administrator's troubles. 1.1 How is the magic rod work? 1.2 Magic really works? 1.3 What are we doing? 1.4 POLY? 2. What is the polygon?

2.0 Real polymorphism. 2.1 species of polymorphism. 2.2 Polygonal failure? 2.3 Is going to sleep? 3. Polymorphism and reconstruction.

3.0 Please hinder our organization's organization structure! 3.1 Poly nightmare - collapse of the library. 4. End · New article. 5. Refer to the book. X. Notes.

0. Write in front.

0.0 keywords.

Chinese: Polymorphism, object-oriented, inheritance, package, abstract class, reconstruction, base, basic class inheritance polymorphism, interface, interface inheritance polymorphism, abstract method, virtual method, overload method, inheritance system, plugin system, reference types, value types, interfaces, multiple inheritance English: Polymorphism, Object-Oriented, Inheritance, Encapsulation, abstract class, base class, Refactoring, interface, abstract method, virtual method, overriden method, override, new, Null Object Pattern, reference type , Value Type, Switch

0.1 System requirements? !

0.1.0 Using object-oriented technology (at least useful intended). 0.1.1 There is a basic understanding of C # (I refer to grammar and related concepts). 0.1.2 Preliminary understanding of object-oriented inheritance and packaging (if you don't know ... you can do it!). 0.1.3 I hope to understand the polymorphism and its related content. 0.1.4 Necessary Tolerance (at least you should read "How to read this article?". Even "How to read this article?" 0.1.5 Others ...

0.2 How to read this article?

Switch (You.Purpose) {Case "I hope to read a story" IF (You.Ispatient) Goto "1. Library Magic Event Book"; Case "because" readonly vs. const "REMARK's last point Come ": goto" 2.0 Real Polymorphism "; Case" I only want to understand the type of polymorphism ": goto" 2.1 "Case" I only want to understand different types of polymorphism: ": goto" 2.2 Polygonal failure? "Case" I just want to know how I reposses 'What is polymorphic?' ": Goto" 2.3 Want to sleep? " ": Goto" 3.0, please hinder our organization's organization structure "; Case" want to learn how Null Object mode and the Introduce Null Object Refactoring principle how to play a polymorphism ": goto" 3.1 Poly Nightmare - Library's collapse "Case" I want to listen to my chat ": goto" 4. End · New article "; Case" I only want to act, "Close your browser"; Defatul : Goto "Read this article from head to tail";} 1. Library Magic Event Book [1].

1.0 Book administrator's troubles.

Poly: The school has expired in these years. There is also a large number of new books in the library, but the administrator is still only two, and it is busy every day. Morph: No way, this is better than unemployment? Poly: Hey, the work of the book that is returned every day will not breathe, if these books can automatically fly back to their own locations, how is it! Morph: Come, I give you a magic stick, so you don't have to worry. POLY: Please! Don't take the toothbrush to play me, today's work is afraid that you can't finish it, no time to joking with you! Morph: Oh, who told you to have this leisure day?

1.1 How is the magic rod work?

Poly, I have just been played by Morph, I have been whitening, and he thinks the magic wand mentioned by Morph, self-speaking self-speaking: "If there is such a magic stick, how will it work?"

He thought of our usual work, thinking that it is necessary to classify the book, and must meet the following two conditions:

a) Each book should have some information, which describes the category of the book and storage location, etc .; B) has a bull who is a bidder to put the book to the storage place.

I thought about thinking, Poly played a brow: "I said, I am not that the cow? I can't, I have to help me!" So, Poly is in meditation: If these books know how to fly back it back If the location of the store is stored ... Yes, you have to let the magic stick help me!

1.2 Can the Magic stick really work?

1.2.0 How does Poly in reality work?

Class

Poly

{Static void main () {// Library is on time on time; library library = new library (); // is of course, poly they have no reason to only open the door of the library, they also have to open the layout of the library. // The door of the first floor is the door, is it necessary to open two mainmen? Floor floor2 = library.floor2; floor floor3 = library.floor3; floor floor4 = library.floor4; // The classmates return a lot of books early in the morning. List books = new list (); // 省 省 b 列 列 列 代 码 码 p 类 把 类 类 把 把 类 类 把 类 类 类 把 把 把 把 把 把 把 把 把 把, //, not silly, I will run to the corresponding floor and put it into the corresponding bookshelf! List floor2car = new list (); list floor3car = new list (); list floor4car = new list (); // poly needs according to each book The information on the information is processed for Foreach (Book Book in Books) {// First, see the book belong to the building of the library. Switch (book.floornumberstring) {// The first floor is a library office and borrowing counter, not to store books. Case "2nd": // put the book into the trolley in the second floor. Floor2car.add (book); Break; Case "3rd": // put the book into the trolley in the third floor. Floor3car.add (book); Break; Case "4th": // put the book into the trolley in the fourth floor. Floor4car.add (book); break; // default: // Where is the book? basement? Still Tiantai? // Break;}} // then Poly Pushed the car to the second floor to the second floor. // We believe that Poly will first classify the book according to the category, put in the basket, // instead of being stupid every book to go to the corresponding bookshelf.

List Mathbasket = new list (); list physicsbasket = new list (); list chemistrybasket = new list (); foreach (book book in floor2car) { Switch (Book.catalog) {CASE "MATH": Mathbasket.add (Book; Break; Case "Physics": PhysicsBasket.add (Book); Break; Case "Chemistry": ChemistryBasket.Add (Book); Break;} } // Poly then ran corresponding to a basket shelf foreach (Book book in mathBasket) floor2.MathShelves.Add (book) foreach (Book book in physicsBasket) floor2.PhysicsShelves.Add (book); foreach (Book book in chemistryBasket Floor2.chemistryShelves.Add (Book); // then pushed the car to the third floor to the third floor. // We also think that Poly will first classify the book according to the category, put it in the basket, // instead of being stupid every book to go to the corresponding bookshelf. List economicsbasket = new list (); list marketingbasket = new list (); list managementbasket = new list (); foreach (book book in floor3car) { Switch (Book.catalog) {CASE "Economics": economicsbasket.add (book); Break; Case "Marketing": MarketingBasket.Add (Book); Break; Case "Management": managementbasket.add (book); break;} } // Poly then ran corresponding to a basket shelf foreach (Book book in economicsBasket) floor3.EconomicsShelves.Add (book) foreach (Book book in marketingBasket) floor3.MarketingShelves.Add (book); foreach (Book book in managementBasket Floor3.ManagementShelves.Add (Book); // then pushed the car to the fourth floor in the fourth floor.

// If Poly is stupid, every book is running to the corresponding bookshelf, then we have to let him run. List programmingbasket = new list (); list sebasket = new list (); list DatabaseBasket = new list (); list networkbasket = new list (); Foreach (Book Book in Floor4car) {Switch (Book.catalog): Programmingbasket.add (Book); Break; Case "Software Engineering": Sebasket.Add (Book); Break; Case "Database": DatabaseBasket.Add (Book); Break; Case "Network": networkbasket.add (book); Break;}} // then Poly Basket Run to the corresponding bookshelf Foreach (Book Book in Programmingbasket) Floor4 .ProgrammingShelves.Add (book) foreach (Book book in seBasket) floor4.SEShelves.Add (book) foreach (Book book in physicsBasket) floor4.DatabaseShelves.Add (book); foreach (Book book in chemistryBasket) floor4.NetworkShelves.Add (Book); // Finally, Poly is lying on the ground}} 1.2.1 poly, I finally understand your cry!

To be honest, I have completed this code, I really understand why Poly has been boring, I think this code should make the school leaders to improve the work environment of the library, at least, I have to ask several people to share the job. Otherwise, a day of school suddenly decided to add a floor to the library, add a new book category or adjust the existing category of the book, Poly will resolutely decide to escape from the army (unemployment army)! Do not believe, you tried to add some of the second bookstore's computer book to the 4th floor of the library, combine the 3rd floor existing categories, and increase the new category of literature, religion, etc., then ... how ? What feeling? Handed a whole body!

1.2.2 Poly decided to wave the magic rod:

What is the name of the magic stick in POLY? Since it is Morph "Give", it is called him Morphism! Ok, Poly waves the Morphism Magic Stick in his hand ...

Class

POLYMORPHISM

{Static void main () {// Library opens on time; library library = new library (); // How to open the door to the door every day, is it automatically opened? // Floor floor1 // The classmates return a lot of books in the morning. List books = new list (); // 省 省 b 列 列 列 代 码 位 位 位 位 位 位 位 位 位. 位 位 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟 哟Foreach (book book in books) {book.return (library);}}} Abstract

Class

Book

{Public abstract void retturn (library library);

Abstract

Class

FLOOR2BOOK: BOOK

{}

Abstract

Class

Floor3book: BOOK

{}

Abstract

Class

FLOOR4BOOK: BOOK

{}

Class

Mathbook: Floor2Book

{Public Override void Return (library library) {library.floor2.mathshelves.add (this);}}

Class

Physicsbook: Floor2Book

{// code here}

Class

Chemistrybook: Floor2Book

{// code here}

Class

Managementbook: Floor3Book

{Public override void return (library library) {library.floor3.managementsHelves.add (this);}}

Class

Economicsbook: Floor3Book

{// code here}

Class

Marketingbook: Floor3Book

{// code here}

Class

Programmingbook: Floor4Book

{Public override void return (library library) {library.floor4.programmingshelves.add (this);}}

Class

SoftwareEngineeringBook: Floor4Book

{// code here}

Class

DatabaseBook: Floor4book

{// code here}

Class

Networkbook: Floor4Book

{// code here}

Below is a by-product produced by the magic rod [2]:

1.2.3 Test the effect of the magic rod.

1.2.3.0 Join New Computer Book Classification.

Class

WebDevelopmentbook: Floor4Book

{Public Override void Return (library library) {library.floor4.webdevelopments Helves.add (this);}}

Of course, you need to put a place in the 4th floor to place a (or more) new bookshelf to place a book of the Web Development class.

1.2.3.1 Merge 3 Floor Existing Classification.

Class

Businessbook: Floor3Book

{Public Override Void Return (library library) {library.floor3.businessshelves.add (this);}} Of course, you need to put the bookshelf of Economics, Marketing, and Management (or you have more The method of putting together), torn off the three labels of the original bookshelf and re-posted the business label.

1.2.3.2 Do you have to cover the fifth floor?

Abstract

Class

FLOOR5BOOK: BOOK

{}

Of course, you need to add a facility and set the book classification for the 5th floor, and put some books.

1.3 What are we doing?

In essence we are refactoring! It is just a clearer and more readable before and after the two codes. Of course, in this refactoring process, we are difficult to avoid the change of library and public facilities (public members) of all floors (public members), so we must be careful!

To be honest, this is not a good example, because the behavior of the book is too many of the details of the library structure and facilities. So, if we can find a middleman (third party?) To deal with these complex relationships (don't say that I am a bad heart!), Avoid excessive entanglement. However, as an open white, I think this should be enough! ?

1.4 POLY?

Poly: "Oh! It hurts! Who is using a book to knock my head?" Morph: "You are too much, actually sleep here," Poly: "Magic Stick ..." Morph: "What magic stick? You take What is this teeth to brush? "Poly:" ... "

2. What is the polygon?

2.0 Real polymorphism.

I used to mention the following sentence in "Readonly vs. Const":

However, when such a code that uses enumeration and conditions, the code that is judged to hinder your more flexible extension, and it is possible to increase the increase in maintenance costs, you can make a polymorphism, use the Replace Conditional With Polymorphism to make the code Refactoring.

Let me try to use the polygon to realize the membership system, first let's take a look at the UML class map:

Then look at the corresponding code:

Class

ORDER

{Public Order (Customer customer) {ID = Guid.NewGuid () ToString ();. M_Customer = customer; m_Products = new List ();} public readonly string ID; private Customer m_Customer; private List m_Products ; public void AddProduct (Product product) {m_Products.Add (product);} public double totalAmount () {double totalAmount = 0.0; foreach (Product product in m_Products) totalAmount = product.Price; return totalAmount * m_Customer.Discount;} Public override string toString () {return "dear" m_customer.name ", / n" "/ Ttotal Amount of Order" ID "IS" TOTALAMOUNT (). Tostring ();}} Abstract

Class

Customer

{Public abstract string name {get;} public abstract Double discount {get;}}

Class

Supervipcustomer: Customer

{Public SuperVipCustomer (string name) {m_Name = name;} private string m_Name; public override string Name {get {return m_Name;}} private const double c_Discount = 0.65; public override double Discount {get {return c_Discount;}} public override String toString () {return "name:" m_name "[supervip]";}}

Class

VIPCUSTOMER: CUSTOMER

{// code here}

Class

NORMALCUSTOMER: CUSTOMER

{// code here}

In this way, if we find business needs in the future, add an inactivecustomer identity to indicate those who haven't shopping for a long time, we can:

Class

InactiveCustomer: Customer

{// code here private const Double c_discount = 1.0; public override double discount {get {return} public override string toString () {return "name:" m_name "[inactive]";}

However, the ORDER class has not been affected, this is the most important! Of course, if we decide to remove Supervip's identity, we will see that there will be any impact on ORDER! This is the power of polymorphism, just happened everything in the library ... forgot! 2.1 species of polymorphism.

2.1.0 Base Class Inheritance Polymorphism (Base Class Polymorphism)

Now let's go back to the online store, we first created a Customer's Abstract Class, then use this Customer's "instance" in ORDER (initialized in the ORDER constructor). However, we know that an Abstract Class is impossible to be instantiated, then what are we referenced? The answer is an example of Customer's derived class (this derived class is no longer Abstract). Since each Customer's derived class is a relationship of IS-A, these derived classes must execute the Customer agreed function, so as long as the Order knows what is the function of Customer, it is possible to deal with the same features in these derived classes. [3]. Of course, if we add some new features in the derived class, then these new features will not be identified by ORDER, because ORDER cannot know the presence of these new features through Customer's agreement.

The key to inheriting the polymorphism using the base class is that there is a inheritance system (if not, establish one) [4], and the client only needs to hold a variable of the top-level class [5] of this system for saving. Its examples of the derived class, and call the predended abstraction method or the false method, the rest will be arranged for you!

Usually we will use the polymorphism when we face a group of related objects. Please pay attention to the code snippet of Order.Totalamount ():

Foreach

(Product Product

in

M_Products) Totalamount

=

Product.price;

The product here may be a base class (abstraction or non-abstract), which may have: Book, Toy, Movie, CD, CPU, etc., however, we need a unified method to put a group of products Plus. Using polymorphism, you can avoid the type of interrogation variable in determining and reading the required data.

2.1.1 Interface inheritance polymorphism (Interface Polymorphism)

In addition to the base class inheritance, we have an interface inheritance polymorphism. As the name suggests, this polymorphism produces an inheritance system by inheriting (more exactly "implementation") interface. Therefore, the key to the inheritance of the interface is also a inheritance system. In general, we will try to use the base class inheritance polymorphism [6], which may be due to the accuracy of the relationship expressed (IS-A and CAN-DO conceptual difference [7]), or version control . However, the interface inheritance polymorphism still has its unique use, when an object needs to have different identities, the interface inherits gives you a way. For example, String declaration is as follows:

public

SeaD

Class

String: IComparable, Icloneable, Iconvertible, IEnumerable, ICompable

<

String

>

In this way, String can attend different identities, for example

System.collection.sortedList.Add (Object)

Key,

Object

Value);

The Key parameter requesting to pass to the method must implement the IComparable interface for sorting comparison.

In other words, C # does not support the base class multiple inheritance, but supports multiple inheritance of the interface.

2.1.2 Mixed inheritance polymorphism?

Since a class can inherit a base class (Interface), we don't want to imagine statement:

public

SeaD

Class

DerivedClass: Baseclass, IINTERFACE

However, there is really a mixed inheritance polymorphism? In fact, it is not, because in a strong type language, the variable can be produced in an identity at a given moment, and it has multiple identities at the same time. You can't make a variable at the same time?

2.2 Polygonal failure?

Use the base class inheritance polymorphism, there is a matter of particular concern that the base class (abstract or non-abstract) is required to obtain a polymorphic effect must have Abstract or Virtual modification. E.g:

Class

Baseclass

{// code here public void printme () {console.writeline ("Printed in Baseclass.");}}

Class

DerivedClass: Baseclass

{// code here public void printme () {Console.writeline ("Printed in DerivedClass.");}}

Class

PROGRAM

{Static void main () {baseclass bc = new baseclass (); BaseClass DC = new derivedclass (); bc.printme (); dc.printme ();}}

Output results:

Printed in baseclass.printed in baseclass.

However, the compiler will give the following warning:

The keyword new is required on 'derivedclass.printme ()' Because it hides inherited member 'baseclass.printme ()'

When we add Virtual before the baseclass's printme (),

public

Virtual

Void

Printme ()

Will get the following warning:

'Derivedclass.printme ()' hides inherited member 'Baseclass.Printme ()'. To make the current member override That Implementation, Add the override keyword. Otherwise add the new keyword.

We should not ignore the compiler's warning, because others can see your intentions, he (or her) may guess whether you missed Override or New keyword, or guess if you don't want to inherit The base class is a member method, why should you play the same name for it (especially when you use New)? So you don't want to inherit the base class, then it is best to give another name. You may have 10,000 reasons to show that the same name is necessary, I don't have to do this, but we should do our best to make the maintenance of the code can see the intent of the code instead of doing The return of the return. It's too much, in fact, this is the content of inheritance [8], saying that these content is mainly to pay attention to the output of the procedure. As a result, it can be seen that there is no polymorphic effect! So I need to repeat this:

Members in the base class (abstract or non-abstract) need to obtain polymorphic effects must have Abstract or Virtual modifications.

As for which modifier is used to see your specific situation.

However, use interface inheritance polymorphism does not need to be aware of these, because all interfaces are abstract, if you want to implement (iMpletement) an interface, you must implement all of its members (whether explicitly or implicit) [9], otherwise the compiler will refuse to compile instead of just give a warning!

2.3 Is going to sleep?

Ok, the story is finished, but you can't always be the same, you can listen to the bed to sleep. We always think after things! Maybe you have found that I have not been a clear definition of the next to the end. Yes, I am not, I don't plan to do this! A complete and accurate definition is too difficult to me, so I choose some examples and related explanations to describe you. But I still want to simply say what is polymorphic:

Polymorphisms are enabled you to use a unified way to process a set of different individuals of each of the same family. [10]

About this multi-state, a little critical, that is, the polymorphism is based on the inheritance system, so the "same family" in this sentence is "belonging to the same inheritance system". Do you feel annoying? Or is there a sentence: forget it!

3. Polymorphism and reconstruction.

3.0 Please hinder our organization's organization structure!

Although the power of polymorphism is powerful, it is not all the code to use the polymorphic place at the beginning. In the face of existing code, how do we re-detonate polymorphism? Answer: Replace Conditional With Polymorphism! [11]

I borrowed a "reconstruction" code [12]:

Class

EMPLOYEE

{// Code here int PayAmount () {switch (GetKind ()) {case EmployeeType.ENGINEER: return _monthlySalary; case EmployeeType.SALESMAN: return _monthlySalary _commission; case EmployeeType.MANAGER: return _monthlySalary _bonus; default: throw new InvalidOperationException ("Incorrect employee";}}}

We hope that the company's salary system will not hinder the company's organizational structure, we may have thousands of positions, each has different salary algorithms, and these algorithms may change at any time, and we are still available at any time. Jobs or remove a position, or temporarily add a temporary position. We hope that the company's organizational structure is also flexible and flexible in the changes in the salary system! Thus, we have to use the polymorphism of [13]. 3.1 Poly nightmare - collapse of the library.

One day, Poly sent a dream, dreaming of Poly and Morph sitting in the lobby of the library and listening to music. It turned out that the effect of the magic list was not only "automated", but also "automated" borrowed. If you want to borrow a book, you only need to walk into the unique hall, then call your name, the book will fly to your hand! If the school leaders know this, they must have two! At this point, a PLMM came to the hall, yelled: Did you have a polymore? Suddenly, Poly and Morph also have the PLMM feeling that the library is shaking, and it is getting more powerful. Finally, the library collapsed! Fortunately, they ran fast, otherwise the consequences are unimaginable. What did you do? Suddenly, the PLMM screamed: there is "unpracitable exception: nullreferenctexception"!

Really a terrible nightmare, but quote empty objects doing the homework in reality, you have to write code to handle it [14]:

Employee E

=

Paymentsystem.geTemPloyee

"

Allen

"

);

IF

(e

! =

NULL

&&&&

E.istimetopay (Today)) E.PAY ();

or

Employee E

=

Paymentsystem.geTemPloyee

"

Allen

"

);

Try

{IF (E.ISTIMETOPAY (TODAY)) E.PAY ();

Catch

(NullReferenceException)

{// Exception Handler code}

However, these codes look very beautiful, have there any more intuitive way to handle? Answer: Introduce Null Object [15]!

Class

EMPLOYEE

{// Code Here Public Virtual Bool iStimeTopay (DateTime DT) {//} public virtual void pay () {//}}

Class

NulleMPloyee: Employee

{// Code Here Public Override Bool ISTIMETOPAY (DATETIME DT) {// empty method! } Public override void pay () {// empty method body! }

Class

PROGRAM

{Static void main () {Employee E = Paymentsystem.geTemPloyee ("allen"); // This, if geteMPloyee ("allen"); return an empty reference, the following code will not do anything! IF (E.ISTIMETOPAY (datetime.today) E.PAY ();}}

In the actual operation, in order to avoid the client's understanding of NulleMPloyee, we can add this class as an inline class (NESTED CLASS) to Employee, and provide a factory method (Factory method) to generate instances of NulleMPloyee. Also, we will use the NULL Object mode with the Singleton mode, because Null Object should be homogeneous for each caller, which is something that constant nature, its ingredient should not change. Class

NulleMPloyee: Employee

{Private static NullEmployee m_Instance = null; private NullEmployee () {} public static NullEmployee CreateInstance () {if (m_Instance == null) m_Instance = new NullEmployee (); return m_Instance;} // Code here}

Sometimes, we need to make an object similar to isnull () judgment and read the value inside, then you can declare an Inullable interface, let NulleMPloyee implement it. However, you can also directly implement the .NET (Ver. 2.0) built-in System.inullableValue interface:

Class

Employee: InullableValue

{// code here inullablevalue.haasval () {return true.value () {Return THIS;}

Class

NulleMPloyee: Employee

{// code here inullablevalue.haasvalue () {Return False;}} {return null;}}

However, Introducture NULL OBJECT can only be used to process the reference type (the value type) is Sealed.

4. End · New article [16].

I don't know the conclusion, I don't know what to say, but I have to leave some things. Ok, let me think about my reply to "what is polymorphism":

Polymorphisms are enabled you to use a unified way to process a set of different individuals of each of the same family.

Recalling that our examples, it is not difficult to find that we have been seaming, is we repaired? Yes, nor. Say it is, that is because we can't give up existing code, you have to make further improvement for these code; say it is not, that is, if you start to take your design, then it is not a Repair, of course, you don't exclude you need to use Replace ... with Polymorphism! However, no one can come up with a perfect design at the beginning, so we need to refactor, and polymorphism, provide us with how to improve our design's basic idea.

So, if we start to take into account our design, how will it be? Plugin system, if there is a bit of scale, this is an answer I can think of. Systems (plug-in systems) that support hot-swap components (plug-in systems) support to increase external function extension modules (plug-in components) to the system without recompilation. However, the system must be able to identify the functionality of these plug-in components and make it sense. As a result, we will pre-agree that a set of plug-in systems can identify the function interface and let the plug-in components implement these interfaces. This plug-in system can identify and call them in a unified manner. This is not a polymorphism? Of course, the design and implementation of the plug-in system is another huge problem. It is not only a polymorphic, and there are many many technologies, but the polymorphism is definitely its core technology, but it must also obey the open - The HEEN-Closed PrinciPle, referred to as an OCP, so that the system can deal with future changes in a more flexible way. As a beginning, I introduced you to you, and the left, you have to take out your own exploration spirit.

5. Refer to the information.

Martin Fowler; Refactoring: Improving the Design of Existing Code; Addison Wesley Longman, Inc., 1999 Robert C. Martin; Agile Software Development: Principles, Patterns, and Practices; Pearson Education, Inc., 2003 Alan Shalloway, James R. Trott ; Design Patterns Explained: A New Perspective on Object-Oriented Design; Addison Wesley, 2002 Jesse Liberty; Programming C #, 3rd Edition; O'Reilly & Associates, Inc., 2003 Jeffrey Richter; Applied Microsoft .NET Framework Programming; Microsoft Press, 2002 Don Box, Chris Sells; Essential .NET, Volume 1: The Common Language Runtime; Addison Wesley, 2002 Eric Gunnerson; A Programmer's Introduction to C #; Apress, 2000 Microsoft Corporation; .NET Framework SDK Documentation; Microsoft Corporation

X. Notes.

转载请注明原文地址:https://www.9cbs.com/read-96824.html

New Post(0)