2006 pearson education, inc. all rights reserved. 1 27 generics many slides modified by prof. l....

55
2006 Pearson Education, Inc. All rights rese 1 2 7 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides added by L.Lilien are © 2006-2009 Leszek T. Lilien. Permision to use for non-commercial purposes slides added by L.Lilien’s will be gladly granted upon a written (e.g., emailed) request.

Post on 20-Dec-2015

215 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

1

2727

Generics Many slides modified by Prof. L. Lilien (even many without an explicit message).

Slides added by L.Lilien are © 2006-2009 Leszek T. Lilien.

Permision to use for non-commercial purposes slides added by L.Lilien’s will be gladly granted upon a written (e.g., emailed) request.

Page 2: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

2

27.1 Introduction

27.2 Motivation for Generic Methods

27.3 Generic Method Implementation

27.4 Type Constraints

27.5 Overloading Generic Methods

27.6 Generic Classes

Page 3: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

3

27.1 Introduction• Generics

- New feature of C# 2.0 (2005)

- Provide compile-time type safety• Catch invalid types at compile time

• Generics discussed:- Generic methods

• A single method declaration / A set of related methods

- Generic classes• A single class declaration / A set of related classes

- Generic interfaces• A single interface declaration / A set of related interfaces

• Not discussed: generic structs, generic delegates

Modified by L. Lilien

Page 4: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

4

27.2 Motivation for Generic Methods

• Let’s start with a solution that uses no generics

• Overloaded methods- Perform similar operations on different types of data

- Example: Overloaded DisplayArray methods for:• int array

• double array

• char array

Modified by L. Lilien

Page 5: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

5 1 // Fig. 27.1 (ed.3): OverloadedMethods.cs

2 // Using overloaded methods to print arrays of different types.

3 using System;

4

5 class OverloadedMethods

6 {

7 static void Main( string[] args )

8 {

9 // create arrays of int, double and char

10 int[] intArray = { 1, 2, 3, 4, 5, 6 };

11 double[] doubleArray = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 };

12 char[] charArray = { 'H', 'E', 'L', 'L', 'O' };

13

14 Console.WriteLine( "Array intArray contains:" );

15 DisplayArray( intArray ); // pass an int array argument

16 Console.WriteLine( "Array doubleArray contains:" );

17 DisplayArray ( doubleArray ); // pass a double array argument

18 Console.WriteLine( "Array charArray contains:" );

19 DisplayArray ( charArray ); // pass a char array argument

20 } // end Main

21

22 // output int array

23 static void DisplayArray ( int[] inputArray )

24 {

25 foreach ( int element in inputArray )

26 Console.Write( element + " " );

27

28 Console.WriteLine( "\n" );

29 } // end method DisplayArray

Outline

OverloadedMethods .cs

(1 of 2)

Declare three arrays of different types

Method calls that invoke three separate methods

(overloaded method) that have the same functionality

Accept an int array and output its elements

Page 6: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

6

30

31 // output double array

32 static void DisplayArray( double[] inputArray )

33 {

34 foreach ( double element in inputArray )

35 Console.Write( element + " " );

36

37 Console.WriteLine( "\n" );

38 } // end method DisplayArray

39

40 // output char array

41 static void DisplayArray( char[] inputArray )

42 {

43 foreach ( char element in inputArray )

44 Console.Write( element + " " );

45

46 Console.WriteLine( "\n" );

47 } // end method DisplayArray

48 } // end class OverloadedMethods Array intArray contains: 1 2 3 4 5 6 Array doubleArray contains: 1.1 2.2 3.3 4.4 5.5 6.6 7.7 Array charArray contains: H E L L O

Outline

OverloadedMethods .cs

(2 of 2)

Accept a double array and output its elements

Accept a char array and output its elements

Page 7: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

7

27.2 Motivation for Generic Methods (Cont.)

• Study all three DisplayArray methods- The only difference among the three methods:

• in Array element type (int/double/char)

• appears in two locations

- In parameter type in the Method header (lines: 23, 32, 41)

- In foreach statement (lines: 25, 34, 43)

• Combine three DisplayArray methods into one- Replace the element types with a generic name E- Declare one DisplayArray method

• Displays the string representation of the elements of an array with elements of any type

Modified by L. Lilien

Page 8: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

8

1 static void DisplayArray( E[] inputArray )

2 {

3 foreach ( E element in inputArray )

4 Console.Write( element + " " );

5

6 Console.WriteLine( "\n" );

7 } // end method DisplayArray

Outline

PrintArray Method

Recall what we used moments ago:22 // output int array

23 static void DisplayArray ( int[] inputArray )

24 {

25 foreach ( int element in inputArray )

26 Console.Write( element + " " );

27

28 Console.WriteLine( "\n" );

29 } // end method DisplayArray 31 // output double array

32 static void DisplayArray( double[] inputArray )

33 {

34 foreach ( double element in inputArray )

35 Console.Write( element + " " );

36

37 Console.WriteLine( "\n" );

38 } // end method DisplayArray

39

40 // output char array

41 static void DisplayArray ( char[] inputArray )

42 {

43 foreach ( char element in inputArray )

44 Console.Write( element + " " );

45

46 Console.WriteLine( "\n" );

47 } // end method DisplayArray

Page 9: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

9

27.3 Generic Method Implementation • In Fig.27.1(ed.3), we did not use generic method• Now:

Reimplement program of Fig.27.1(ed.3) using a generic method

- Method calls are identical- Outputs are identical (string representations of array elements)

• Generic method declaration- Type parameter list- Delimited by angle brackets ( < and > )

• Precedes the method’s argument list• Contains one or more type parameters (below: T)

- Separated by commas (if > 1 type parameter)

- Example: static void DisplayArray< T >( ... )

Modified by L. Lilien

Page 10: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

10 1 // Fig. 27.3 (ed.3): GenericMethod.cs

2 // Using overloaded methods to print arrays of different types.

3 using System;

4 using System.Collections.Generic;

5

6 class GenericMethod

7 {

8 static void Main( string[] args )

9 {

10 // create arrays of int, double and char

11 int[] intArray = { 1, 2, 3, 4, 5, 6 };

12 double[] doubleArray = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 };

13 char[] charArray = { 'H', 'E', 'L', 'L', 'O' };

14

15 Console.WriteLine( "Array intArray contains:" );

16 DisplayArray( intArray ); // pass an int array argument

17 Console.WriteLine( "Array doubleArray contains:" );

18 DisplayArray ( doubleArray ); // pass a double array argument

19 Console.WriteLine( "Array charArray contains:" );

20 DisplayArray ( charArray ); // pass a char array argument

21 } // end Main

Outline

GenericMethod.cs

(1 of 2)

Call generic method to print out elements of

arrays of different type

Note: Main in this slide is an exact copy of Main for OverloadedMethods .

Page 11: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

1122

23 // output array of all types

24 static void DisplayArray< T >( T[] inputArray )

25 {

26 foreach ( T element in inputArray )

27 Console.Write( element + " " );

28

29 Console.WriteLine( "\n" );

30 } // end method DisplayArray

31 } // end class GenericMethod Array intArray contains: 1 2 3 4 5 6 Array doubleArray contains: 1.1 2.2 3.3 4.4 5.5 6.6 7.7 Array charArray contains: H E L L O

Outline

GenericMethod.cs

(2 of 2)

Generic method header

Use the type parameter T as an identifier in place of actual type names

Type parameter list (here with just 1 element: T)

Note: Only 1 generic method instead of 3 overloaded methods for OverloadedMethods .

31 // output double array

32 static void DisplayArray( double[] inputArray )

33 {

34 foreach ( double element in inputArray )

35 Console.Write( element + " " );

36

37 Console.WriteLine( "\n" );

38 } // end method DisplayArray

39

40 // output char array

41 static void displayArray( char[] inputArray )

42 {

43 foreach ( char element in inputArray )

44 Console.Write( element + " " );

45

46 Console.WriteLine( "\n" );

47 } // end method DisplayArray

Recall what we used in Fig. 27.1:

22 // output int array

23 static void DisplayArray ( int[] inputArray )

24 {

25 foreach ( int element in inputArray )

26 Console.Write( element + " " );

27

28 Console.WriteLine( "\n" );

29 } // end method DisplayArray

Output the elements in an array of any type

Page 12: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

12

++ READ LATER++ 27.3 Generic Method Implementation (Cont.)

• Type parameterse.g.: T in: static void DisplayArray<T>( T[] inputArray )

- Used to declare:• Return type

not used in the example above

• Parameter typese.g.: static void Print Array<T>( T[] inputArray )

• Local variable typese.g.: foreach ( T element in InputArray )

- Act as placeholders for the types of the arguments passed to the generic method

- Are identifiers that specify generic type names

Modified by L. Lilien

Page 13: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

13

27.3 Generic Method Implementation (Cont.)

• Type inferencing (for implicit type arguments)

- E.g., for the call: DisplayArray ( int Array ); (see l.16 of

Fig.27.3)

- Compiler determines that an exact match occurs if the type parameter T of a generic method is replaced with a type of the elements in method call’s argument

• e.g., exact match if T in DisplayArray declaration in line 24 of Fig.27.3 is replaced with int for line 16 in Fig.27.3

- Then, compiler sets up a call to the method with that type as the type argument for the parameter T

• e.g., sets up a call to DisplayArray (defined in l.24-31) with int for T

- We could have used explicit type argument(s) to indicate the exact type that should be used to call a generic function

e.g., DisplayArray< int >( int Array ); (could be used in l.16)

Modified by L. Lilien

Page 14: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

14

** READ LATER** Common Programming Error 27.1

If you forget to include the type parameter list when declaring a generic method, the compiler will not recognize the type parameter names when they are encountered in the method.

This results in compilation errors.

e.g.: don’t forget the type parameter list <T> in:

static void DisplayArray<T>( T[] inputArray )

Page 15: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

15

** READ LATER**Good Programming Practice 27.1

It is recommended that type parameters be specified as individual capital letters.

Typically, a type parameter that represents the type of an element in an array (or other collection) is named T for “type” or E for “element.”

Page 16: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

16

** READ LATER** Common Programming Error 27.2

A compilation error occurs

if the compiler cannot find a single non-generic or generic method declaration that is a best match for a method call,

or

if there are multiple best matches

Page 17: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

17

27.4 Type Constraints• Type Constraints

- Example: Generic Maximum method • Determines & returns the largest of its three arguments (of the same type) • Type parameter <T> declares both the method’s return type T and the

type T of its parameters • E.g.: static T Maximum< T >( T x, T y, T z )

where T : IComparable < T > // constraint on T - the ‘where’ clause defines a constraint on T

• assures that type T implements the interface IComparable <T>

- Interface Icomparable defines method CompareTo - CompareTo is needed to find maximum

• Example of using CompareTo for T being int- int1.CompareTo( int2 ) returns:

• a negative integer if int1 < int2• 0 if int1 = int2 • a positive integer if int1 > int2

- Similarly for T being double and T being char

Page 18: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

18

27.4 Type Constraints – Cont.

- The method CompareTo is not allowed to be called by a generic method unless the compiler can ensure that the method is provided for every type that will ever be used in the generic code

- IComparable < T > allows objects of the same type T to be compared using the method CompareTo

Page 19: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

19

** READ LATER ** 27.4 Type Constraints (Cont.)

• Type Constraints (Cont.)

- In general:One can not call an operator on a generic-type variable unless the compiler can ensure that all types that will ever be used in the generic code (for this variable) support that operator

• We’ll see how the where clause is used to constrain use to only “ensured” cases

Page 20: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

20

** READ LATER ** 27.4 Type Constraints (Cont. 1)

•IComparable< T > interface- Allows objects of the same type to be compared

• Classes of these objects must implement the generic interface IComparable< T >

- E.g., Int32 and Double implement the generic interface IComparable• E.g., the IComparable < T > objects can be used with the sorting and

searching methods of classes in the System.Collections.Generic namespace

- We’ll see them used so in Ch.28 – on Collections

- The structures underlying the simple types all implement this interface• So we can compare, e.g., int1 with int2, char1 with char2 , etc.

- They declare a CompareTo method for comparing objects• Example: Recall that for int1.CompareTo( int2 ) it returns:

- a negative integer if int1 < int2

- 0 if int1 = int2

- a positive integer if int1 > int2

Modified by L. Lilien

Page 21: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

21** READ LATER ** 27.4 Type Constraints (Cont.2)• Specifying Type Constraints

- IComparable objects can be compared- But they cannot be used with generic code by default

• Because not all types implement interface IComparable< T >- Some types that are not simple do not

• Restrict the types that can be used with a generic method or class to ensure that they meet certain requirements

- This is known as a type constraint• Restricts the type of the argument supplied to a particular type

parameter- The where clause specifies the type constraint for type

parameter T

• Example generic method with a type constraint: static T Maximum< T >( T x ) where T : IComparable < T >

(first T [after ‘static’] specifies method return type as T)- Requires that T implements IComparable<T> interface

• Now, all objects of type T used by Maximum are guaranteed to have implementations for all methods defined in the Icomparable interface (e.g., the CompareTo method needed in Fig. 27.4-ed.3)

Modified by L. Lilien

Page 22: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

22** READ LATER ** 27.4 Type Constraints (Cont.3)

- C# provides several kinds of type constraintsNOTE: We discuss class type and interface type constraints only.1) Class (or: class-type) constraint (discussed long time ago)

- Indicates that the type argument must be an object of a specific base class or one of its derived classes

2) Use the reference-type constraint (class)- Indicates that the type argument must be a reference type

3) Use the value-type constraint (struct)4) Interface (or: interface-type) constraint (just discussed)

- Indicates that the type argument’s class must implement a specific interface

- Indicates that the type argument must be a value type

5) Constructor constraint new()- Indicates that the generic code can use operator new to create new

objects of the type represented by the type parameter • Must provide public parameterless or default constructor

- Ensure that objects of the class can be created without passing constructor arguments

Page 23: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

23

** READ LATER ** 27.4 Type Constraints (Cont.4)

- C# provides several kinds of type constraints (cont.)

6) Multiple constraints on a type parameter- Provide a comma-separated list of constraints in the where

clause• Class constraint, reference type or value type constraint,

must be listed first- Only one of these types of constraints can be used for each type

parameter- However ,can use many constraints of a given type• Interface constraints are listed next• The constructor constraint is listed last (if there is one)

Modified by L. Lilien

Page 24: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

24 1 // Fig 27.4 (ed.3): MaximumTest.cs

2 // Generic method maximum returns the largest of three objects.

3 using System;

4

5 class MaximumTest

6 {

7 public static void Main( string[] args )

8 {

9 Console.WriteLine( "Maximum of {0}, {1} and {2} is {3}\n",

10 3, 4, 5, Maximum( 3, 4, 5 ) );

11 Console.WriteLine( "Maximum of {0}, {1} and {2} is {3}\n",

12 6.6, 8.8, 7.7, Maximum( 6.6, 8.8, 7.7 ) );

13 Console.WriteLine( "Maximum of {0}, {1} and {2} is {3}\n",

14 "pear", "apple", "orange",

15 Maximum( "pear", "apple", "orange" ) );

16 } // end Main

17

18 // generic method Maximum determines the

19 // largest of the IComparable objects

Outline

MaximumTest.cs

(1 of 2)

Call generic method Maximum with

interface type constraint (shown on

next slide)

Page 25: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

2520 private static T Maximum< T >( T x, T y, T z ) 21 where T : IComparable < T > 22 {

23 T max = x; // assume x is initially the largest

24

25 // compare y with max

26 if ( y.CompareTo( max ) > 0 )

27 max = y; // y is the largest so far

28

29 // compare z with max

30 if ( z.CompareTo( max ) > 0 )

31 max = z; // z is the largest

32

33 return max; // return largest object

34 } // end method Maximum

35 } // end class MaximumTest Maximum of 3, 4 and 5 is 5 Maximum of 6.6, 8.8 and 7.7 is 8.8 Maximum of pear, apple and orange is pear

Outline

MaximumTest.cs

(2 of 2)

Interface constraint - Indicates that this method requires the type arguments T to implement interface IComparable

Example of using CompareTo for int

int1.CompareTo( int2 ) returns:

- a negative integer if int1 < int2

- 0 if int1 = int2

- a positive integer if int1 > int2

Similarly for double and char

Uses type parameter T as the return type of the method

and as the type of the method’s three parameters

Page 26: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

26

27.5 Overloading Generic Methods

• Generic method may be overloaded1) By another generic method with different signature:

2) By non-generic methods

.. Details next ..

Modified by L. Lilien

Page 27: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

27

** READ LATER ** 27.5 Overloading Generic Methods

• Generic method may be overloaded1) By another generic method with different signature:

• Same method name • Different method parameters

Example: Generic method DisplayArray could be overloaded with a generic method with the additional parameters lowIndex and highIndex that specify the portion of the array to output.

2) By non-generic methods with:• Same method name • Any number of parameters

Example: Generic method DisplayArray could be overloaded with a non-generic method specific to strings that outputs the strings in neat, tabular format.

Modified by L. Lilien

Page 28: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

28

** READ LATER ** 27.5  Overloading Generic Methods

• Compiler encountering a method call:- Searches for the method declaration that most precisely

matches the method name and argument types- Generates an error if:

• Ambiguity due to multiple possible matches• No matches

Page 29: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

29

In-class Exercise

Write a generic method to find the maximal value in an array.

Hint: You might start with writing non-generic method to find the maximal value in an _int_ array, and then "convert" the method into a generic one. Finally, test that it works with >=1 data types (e.g., int and double).

Modified by L. Lilien

Page 30: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

30

27.6 Generic Classes

• We just covered generic methods

• Now: Generic classes- Describe classes in type-independent manner- Use simple, concise notation to indicate the actual type(s)

• At compilation time, C# compiler:- Ensures the type safety - Replaces type parameters with actual arguments

• Enables client code to interact with the generic class

Modified by L. Lilien

Page 31: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

31

** READ LATER ** 27.6 Generic Classes (Cont.)

• Components of generic class declaration- Class name - Followed by a type parameter list

• Optional: constraints on its type parameter s

• Type parameter T - Represents the element type that is manipulated- Used throughout the class declaration to represent the element type

Modified by L. Lilien

Page 32: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

32

27.6 Generic Classes – cont.

• We will implement application using generic class Stack:

1) Without generic methods in test application – generic class & non-generic methods in test application

• Separate non-generic methods in test application- TestPushDouble() / TestPushInt() <– almost identical, both

implemented using Push from Stack

- TestPopDouble() / TestPopInt() <– almost identical, bothimplemented using Pop from

Stack

2) With generic methods in test application – generic class & generic methods in test application

• Generic methods in test application- TestPush< T > <– both implemented using Push from Stack- TestPop< T > <– both implemented using Pop from Stack

Modified by L. Lilien

Page 33: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

33

27.6 Generic Classes – cont.

- Next: generic class & non-generic methods in test application• Separate, non-generic methods in test application

- TestPushDouble() / TestPushInt() <– almost identical, bothimplemented using Push

from Stack

- TestPopDouble() / TestPopInt() <– almost identical, bothimplemented using Pop

from Stack

Modified by L. Lilien

Page 34: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

34 1 // Fig. 27.5 (ed.3): Stack.cs

2 // Generic class Stack

3 using System;

4

5 class Stack< T >

6 {

7 private int top; // location of the top element

8 private T[] elements; // array that stores stack elements

9

10 // parameterless constructor creates a stack of the default size

11 public Stack() 12 : this( 10 ) // default stack size

13 {

14 // empty constructor; calls constructor at line 17 to perform init

15 } // end Stack constructor

16

17 // constructor creates a stack of the specified number of elements

18 public Stack( int stackSize )

19 {

20 if ( stackSize > 0 ) // validate stackSize

21 elements = new T[ stackSize ]; // create stackSize elements

22 else

23 throw new ArgumentException( “Stack size must be positive.” )

24

25 top = -1; // stack initially empty

26 } // end Stack constructor

Outline

Stack.cs

(1 of 2)

Type parameter T is used throughout the Stack class to

represent the element type

Declare elements as an array of type T

Initialize elements to the appropriate size

Page 35: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

3527

28 // push element onto the stack; if unsuccessful,

29 // throw FullStackException

30 public void Push( T pushValue )

31 {

32 if ( top == elements.Length - 1 ) // Stack is full

33 throw new FullStackException( String.Format(

34 "Stack is full, cannot push {0}", pushValue ) );

35

36 top++; // increment top

37 elements[ top ] = pushValue; // place pushValue on Stack

38 } // end method Push

39

40 // return the top element if not empty

41 // else throw EmptyStackException

42 public T Pop()

43 {

44 if ( top == -1 ) // Stack is empty

45 throw new EmptyStackException( "Stack is empty, cannot pop" );

46

47 top--; // decrement top

48 return elements[ top + 1 ]; // return top value

49 } // end method Pop

50 } // end class Stack

Outline

Stack.cs

(2 of 2)Throw exception if stack is full

Increment top counter to indicate

the new top position and store

the argument

Throw exception if stack is empty

Decrement top counter to indicate the new

top position and return the original top

element

Page 36: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

36

++ READ LATER++ 27.6  Generic Classes (Cont.)

• In a generic class declaration, the class name is followed by a type-parameter list and, optionally, a constraint on its type parameter.

• As with generic methods, the type-parameter list of a generic class can have one or more type parameters separated by commas.

Page 37: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

37 1 // Fig. 27.6(ed.3): FullStackException.cs

2 // Indicates a stack is full.

3 using System;

4

5 class FullStackException : Exception

6 {

7 // parameterless constructor

8 public FullStackException() : base( "Stack is full" )

9 {

10 // empty constructor

11 } // end FullStackException constructor

12

13 // one-parameter constructor

14 public FullStackException(string exception) : base( exception )

15 {

16 // empty constructor

17 } // end FullStackException constructor

18

19 // two-parameter constructor

20 public FullStackException( string exception, Exception inner )

22 : base( exception )

22 {

23 // empty constructor

24 } // end FullStackException constructor

25 } // end class FullStackException

Outline

FullStackException.cs

Create user-defined (really: programmer-defined)

exception for when the stack is full

Page 38: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

38 1 // Fig. 27.7 (ed.3): EmptyStackException.cs

2 // Indicates a stack is empty

3 using System;

4

5 class EmptyStackException : Exception

6 {

7 // parameterless constructor

8 public EmptyStackException() : base( "Stack is empty" )

9 {

10 // empty constructor

11 } // end EmptyStackException constructor

12

13 // one-parameter constructor

14 public EmptyStackException( string exception ) : base( exception )

15 {

16 // empty constructor

17 } // end EmptyStackException constructor

18

// two-parameter constructor here

25 } // end class EmptyStackException

Outline

EmptyStackException.cs

Create customize exception for when the stack is empty

18

19 // two-parameter constructor

20 public EmptyStackException( string exception, Exception inner )

21 : base( exception, inner )

22 {

23 // empty constructor

24 } // end EmptyStackException constructor

25 } // end class EmptyStackException

Page 39: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

39

++ READ LATER++ 27.6  Generic Classes (Cont.)

• The compiler performs type checking on the class’s type parameters to ensure that they can be used with the code in the generic class.

• The constraints determine the operations that can be performed on the type parameters.

• The runtime system replaces the type parameters with the actual types at runtime.

• The scope of a generic class’s type parameter is the entire class.

Page 40: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

40

1 // Fig. 27.8: StackTest.cs

2 // Testing generic class Stack.

3 using System;

4

5 class StackTest

6 {

7 // create arrays of doubles and ints

8 private static double[] doubleElements =

9 new double[]{ 1.1, 2.2, 3.3, 4.4, 5.5, 6.6 };

10 private static int[] intElements =

11 new int[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };

12

13 private static Stack< double > doubleStack; // stack stores doubles

14 private static Stack< int > intStack; // stack stores int objects

15

16 public static void Main( string[] args )

17 {

18 doubleStack = new Stack< double >( 5 ); // stack of doubles

19 intStack = new Stack< int >( 10 ); // stack of ints

20

• Now, let’s consider an application (Fig. 27.8 - below) that uses the Stack generic class.

Outline

StackTest.cs

(1 of 8 )

Fig. 27.8 | Testing generic class Stack. (Part 1 of 8.)

declare variables of type Stack< double > and Stack< int >. The types double and int are the Stack’s type arguments.

Page 41: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

41

21 TestPushDouble(); // push doubles onto doubleStack

22 TestPopDouble(); // pop doubles from doubleStack

23 TestPushInt(); // push ints onto intStack

24 TestPopInt(); // pop ints from intStack

25 } // end Main

26

27 // test Push method with doubleStack

28 private static void TestPushDouble()

29 {

30 // push elements onto stack

31 try

32 {

33 Console.WriteLine( "\nPushing elements onto doubleStack" );

34

35 // push elements onto stack

36 foreach ( var element in doubleElements )

37 {

38 Console.Write( "{0:F1} ", element );

39 doubleStack.Push( element ); // push onto doubleStack

40 } // end foreach

41 } // end try

Outline

StackTest.cs

(2 of 8 )

Fig. 27.8 | Testing generic class Stack. (Part 2 of 8.)

Page 42: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

42

42 catch ( FullStackException exception )

43 {

44 Console.Error.WriteLine();

45 Console.Error.WriteLine( "Message: " + exception.Message );

46 Console.Error.WriteLine( exception.StackTrace );

47 } // end catch

48 } // end method TestPushDouble

49

50 // test Pop method with doubleStack

51 private static void TestPopDouble()

52 {

53 // pop elements from stack

54 try

55 {

56 Console.WriteLine( "\nPopping elements from doubleStack" );

57

58 double popValue; // store element removed from stack

59

Outline

StackTest.cs

(3 of 8 )

Fig. 27.8 | Testing generic class Stack. (Part 3 of 8.)

Page 43: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

43

60 // remove all elements from stack

61 while ( true )

62 {

63 popValue = doubleStack.Pop(); // pop from doubleStack

64 Console.Write( "{0:F1} ", popValue );

65 } // end while

66 } // end try

67 catch ( EmptyStackException exception )

68 {

69 Console.Error.WriteLine();

70 Console.Error.WriteLine( "Message: " + exception.Message );

71 Console.Error.WriteLine( exception.StackTrace );

72 } // end catch

73 } // end method TestPopDouble

74

75 // test Push method with intStack

76 private static void TestPushInt()

77 {

78 // push elements onto stack

79 try

80 {

81 Console.WriteLine( "\nPushing elements onto intStack" );

82

Outline

StackTest.cs

(4 of 8 )

Fig. 27.8 | Testing generic class Stack. (Part 4 of 8.)

Page 44: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

44

83 // push elements onto stack

84 foreach ( var element in intElements )

85 {

86 Console.Write( "{0} ", element );

87 intStack.Push( element ); // push onto intStack

88 } // end foreach

89 } // end try

90 catch ( FullStackException exception )

91 {

92 Console.Error.WriteLine();

93 Console.Error.WriteLine( "Message: " + exception.Message );

94 Console.Error.WriteLine( exception.StackTrace );

95 } // end catch

96 } // end method TestPushInt

97

98 // test Pop method with intStack

99 private static void TestPopInt()

100 {

101 // pop elements from stack

102 try

103 {

104 Console.WriteLine( "\nPopping elements from intStack" );

Outline

StackTest.cs

(5 of 8 )

Fig. 27.8 | Testing generic class Stack. (Part 5 of 8.)

Page 45: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

45

105

106 int popValue; // store element removed from stack

107

108 // remove all elements from stack

109 while ( true )

110 {

111 popValue = intStack.Pop(); // pop from intStack

112 Console.Write( "{0} ", popValue );

113 } // end while

114 } // end try

115 catch ( EmptyStackException exception )

116 {

117 Console.Error.WriteLine();

118 Console.Error.WriteLine( "Message: " + exception.Message );

119 Console.Error.WriteLine( exception.StackTrace );

120 } // end catch

121 } // end method TestPopInt 122 } // end class StackTest

Outline

StackTest.cs

(6 of 8 )

Fig. 27.8 | Testing generic class Stack. (Part 6 of 8.)

Page 46: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

46

Pushing elements onto doubleStack 1.1 2.2 3.3 4.4 5.5 6.6 Message: Stack is full, cannot push 6.6 at Stack`1.Push(T pushValue) in C:\Examples\ch27\Fig27_05_08\Stack\Stack\Stack.cs:line 33 at StackTest.TestPushDouble() in C:\Examples\ch27\Fig27_05_08\Stack\Stack\StackTest.cs:line 39 Popping elements from doubleStack 5.5 4.4 3.3 2.2 1.1

Message: Stack is empty, cannot pop at Stack`1.Pop() in C:\Examples\ch27\Fig27_05_08\Stack\Stack\Stack.cs:line 45 at StackTest.TestPopDouble() in C:\Examples\ch27\Fig27_05_08\Stack\Stack\StackTest.cs:line 63 (continued on next page...)

Outline

StackTest.cs

(7 of 8 )

Fig. 27.8 | Testing generic class Stack. (Part 7 of 8.)

Page 47: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

47

(continued from previous page…) Pushing elements onto intStack 1 2 3 4 5 6 7 8 9 10 11 Message: Stack is full, cannot push 11 at Stack`1.Push(T pushValue) in C:\Examples\ch27\Fig27_05_08\Stack\Stack\Stack.cs:line 33 at StackTest.TestPushInt() in C:\Examples\ch27\Fig27_05_08\Stack\Stack\StackTest.cs:line 87 Popping elements from intStack 10 9 8 7 6 5 4 3 2 1 Message: Stack is empty, cannot pop at Stack`1.Pop() in C:\Examples\ch27\Fig27_05_08\Stack\Stack\Stack.cs:line 45 at StackTest.TestPopInt() in C:\Examples\ch27\Fig27_05_08\Stack\Stack\StackTest.cs:line 111

Outline

StackTest.cs

(8 of 8 )

Fig. 27.8 | Testing generic class Stack. (Part 8 of 8.)

Page 48: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

48

27.6 Generic Classes – cont.

• Above: application implemented using generic class Stack

without generic methods in test application – generic class & non-generic methods in test application

• Separate non-generic methods in test application- TestPushDouble() / TestPushInt() <– almost identical, both

implemented using Push from Stack

- TestPopDouble() / TestPopInt() <– almost identical, both

implemented using Pop from Stack

• Now: application will be implemented using generic class Stack with generic methods in test application

– generic class & generic methods in test application• Generic methods in test application

- TestPush< T > <– both implemented using Push from Stack- TestPop< T > <– both implemented using Pop from Stack

• Figure 27.9 (next) declares TestPush and TestPop- To push and pop elements from a Stack containing elements of any type T

Modified by L. Lilien

Page 49: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

49

1 // Fig. 27.9: StackTest.cs

2 // Testing generic class Stack.

3 using System;

4 using System.Collections.Generic;

5

6 class StackTest

7 {

8 // create arrays of doubles and ints

9 private static double[] doubleElements =

10 new double[] { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6 };

11 private static int[] intElements =

12 new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };

Outline

StackTest.cs

(1-2 of 6 )

13 14 private static Stack< double > doubleStack; // stack stores doubles 15 private static Stack< int > intStack; // stack stores int objects

16

17 public static void Main( string[] args )

18 {

19 doubleStack = new Stack< double >( 5 ); // stack of doubles

20 intStack = new Stack< int >( 10 ); // stack of ints

21

22 // push doubles onto doubleStack

23 TestPush( "doubleStack", doubleStack, doubleElements );

24 // pop doubles from doubleStack

25 TestPop( "doubleStack", doubleStack );

26 // push ints onto intStack

27 TestPush( "intStack", intStack, intElements );

28 // pop ints from intStack

29 TestPop( "intStack", intStack );

30 } // end Main

31

Page 50: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

50

32 // test Push method

33 private static void TestPush< T >( string name, Stack< T > stack,

34 IEnumerable< T > elements )

35 {

36 // push elements onto stack

37 try

38 {

39 Console.WriteLine( "\nPushing elements onto " + name );

40

41 // push elements onto stack

42 foreach ( var element in elements )

43 {

44 Console.Write( "{0} ", element );

45 stack.Push( element ); // push onto stack

46 } // end foreach

47 } // end try

48 catch ( FullStackException exception )

49 {

50 Console.Error.WriteLine();

51 Console.Error.WriteLine( "Message: " + exception.Message );

52 Console.Error.WriteLine( exception.StackTrace );

53 } // end catch

54 } // end method TestPush

OutlineStackTest.cs

(3 of 6 )

Fig. 27.9 | Testing generic class Stack. (Part 3 of 6.)

Generic method TestPush uses type parameter T to represent the data type stored in the Stack.

Recall: The generic interface IEnumerable describes objects that can be iterated over, e.g., using foreach (see Line 42).

Page 51: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

51

55

56 // test Pop method

57 private static void TestPop< T >( string name, Stack< T > stack )

58 {

59 // push elements onto stack

60 try

61 {

62 Console.WriteLine( "\nPopping elements from " + name );

63

64 T popValue; // (variable declaration) stores element removed from stack

65

66 // remove all elements from stack

67 while ( true )

68 {

69 popValue = stack.Pop(); // pop from stack

70 Console.Write( "{0} ", popValue );

71 } // end while

72 } // end try

Outline

StackTest.cs

(4 of 6 )

Fig. 27.9 | Testing generic class Stack. (Part 4 of 6.)

Page 52: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

52

73 catch ( EmptyStackException exception )

74 {

75 Console.Error.WriteLine();

76 Console.Error.WriteLine( "Message: " + exception.Message );

77 Console.Error.WriteLine( exception.StackTrace );

78 } // end catch

79 } // end TestPop

80 } // end class StackTest Pushing elements onto doubleStack 1.1 2.2 3.3 4.4 5.5 6.6 Message: Stack is full, cannot push 6.6 at Stack`1.Push(T pushValue) in C:\Examples\ch27\Fig27_09\Stack\Stack\Stack.cs:line 33 at StackTest.TestPush[T](String name, Stack`1 stack, IEnumerable`1 elements) in C:\Examples\ch27\Fig27_09\Stack\Stack\StackTest.cs:line 45 Popping elements from doubleStack 5.5 4.4 3.3 2.2 1.1 (continued on next page...)

Outline

StackTest.cs

(5 of 6 )

Fig. 27.9 | Testing generic class Stack. (Part 5 of 6.)

Page 53: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

53

continued from previous page…) Message: Stack is empty, cannot pop at Stack`1.Pop() in C:\Examples\ch27\Fig27_09\Stack\Stack\Stack.cs:line 45 at StackTest.TestPop[T](String name, Stack`1 stack) in C:\Examples\ch27\Fig27_09\Stack\Stack\StackTest.cs:line 69 Pushing elements onto intStack 1 2 3 4 5 6 7 8 9 10 11 Message: Stack is full, cannot push 11 at Stack`1.Push(T pushValue) in C:\Examples\ch27\Fig27_09\Stack\Stack\Stack.cs:line 33 at StackTest.TestPush[T](String name, Stack`1 stack, IEnumerable`1 elements) in C:\Examples\ch27\Fig27_09\Stack\Stack\StackTest.cs:line 45 Popping elements from intStack 10 9 8 7 6 5 4 3 2 1 Message: Stack is empty, cannot pop at Stack`1.Pop() in C:\Examples\ch27\Fig27_09\Stack\Stack\Stack.cs:line 45 at StackTest.TestPop[T](String name, Stack`1 stack) in C:\Examples\ch27\Fig27_09\Stack\Stack\StackTest.cs:line 69

Outline

StackTest.cs

(6 of 6 )

Fig. 27.9 | Testing generic class Stack. (Part 6 of 6.)

Page 54: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

54

++ READ LATER ++ 27.x Final notes on Generics and Inheritance

• (Recall) Generics and inheritance- Generic classes can be derived from non-generic classes

- Generic classes can be derived from other generic classes

- Non-generic classes can be derived from generic classes

- (and, as we know very well) non-generic classes can be derived from non-generic classes

Modified by L. Lilien

Page 55: 2006 Pearson Education, Inc. All rights reserved. 1 27 Generics Many slides modified by Prof. L. Lilien (even many without an explicit message). Slides

2006 Pearson Education, Inc. All rights reserved.

55

The Endof Ch. 27 - Generics

Modified by L. Lilien