10 Advanced Object-Oriented Programming Features C# Programming: From Problem Analysis to Program Design 2nd Edition C# Programming: From Problem Analysis to Program Design 1 Chapter Objectives • Learn the major features of object-oriented languages • Design and develop multitier applications using component-based development methods • Use inheritance to extend the functionality of userdefined classes • Create abstract classes that include abstract methods C# Programming: From Problem Analysis to Program Design 2 Chapter Objectives (continued) • Become aware of partial classes • Design and implement interfaces • Understand why polymorphic programming is a common goal in .NET • Explore generics and learn how to create generic classes and generic methods • Work through a programming example that illustrates the chapter’s concepts C# Programming: From Problem Analysis to Program Design 3 Object-Oriented Language Features • Abstraction – Abstract or identify the objects involved in the problem • Encapsulation – Packaging data and behaviors into a single unit • Inheritance – Reuse of code through extending program units • Polymorphism – Multiple implementations of the same behaviors C# Programming: From Problem Analysis to Program Design 4 Component-Based Development Figure 10-1 Component-based development C# Programming: From Problem Analysis to Program Design 5 Component-Based Development (continued) • Multitier applications – Data access tier for accessing data from text files and databases – Graphical user interface tier for user interaction • Windows • Web • Components implemented through classes in C# • Class library files with a dynamic link library (DLL) extension C# Programming: From Problem Analysis to Program Design 6 Inheritance • Enables you to: – Create a general class and then define specialized classes that have access to the members of the general class • Associated with an "is a" relationship – Specialized class “is a” form of the general class • Classes can also have a "has a" relationship, not associated with inheritance – "has a" relationship associated with containment or aggregation C# Programming: From Problem Analysis to Program Design 7 Inheriting from the Object Class • Every object inherits four methods as long as reference to the System namespace included Figure 10-2 Methods inherited from an object C# Programming: From Problem Analysis to Program Design 8 Inheriting from Other .NET FCL Classes • Add functionality to programs with minimal programming • Extend System.Windows.Forms.Form class to build GUIs (Button, Label, TextBox, ListBox) Derived class Base class Figure 10-3 Derived class C# Programming: From Problem Analysis to Program Design 9 Creating Base Classes for Inheritance • Can define your own classes from which other classes can inherit • Base class is called the super or parent class • Data members are defined with a private access modifier • Constructors are defined with public access modifiers • Properties offer public access to data fields C# Programming: From Problem Analysis to Program Design 10 Overriding Methods • Replace the method defined at a higher level • Keyword override included in derived class – Base method includes virtual, abstract, or override keyword • Overriding differs from overloading a method – Overridden methods have exactly the same signature – Overloaded methods each have a different signature Figure 10-4 ToString( ) signature C# Programming: From Problem Analysis to Program Design 11 Overriding Methods (continued) • Example of polymorphism – ToString( ) method can have many different definitions – ToString( ) uses the virtual modifier implying any class can override it • Derived classes inherit from a base class – Also called subclasses or child classes • Protected access modifiers – Access only to classes that derived from them – Access to change data in the base class C# Programming: From Problem Analysis to Program Design 12 Calling the Base Constructor • To call the constructor for the base class, add keyword :base between the constructor heading for the subclass and the opening curly brace public Student(string id, string fname, string lname, string maj, int sId) :base (id, lname, fname) // base constructor arguments { ... • Base constructor must have a constructor with matching signature C# Programming: From Problem Analysis to Program Design 13 Using Members of the Base Class • Scope – Methods defined in subclass take precedence when named the same name as member of a parent class • Can call an overridden method of the base class – Use keyword base before the method name return base.GetSleepAmt( ) // Calls GetSleepAmt( ) in // parent class C# Programming: From Problem Analysis to Program Design 14 Relationship Between the Person and Student Classes Figure 10-5 Inheritance class diagram C# Programming: From Problem Analysis to Program Design 15 Making Stand-alone Components • Compile class and create an assembly – Assemblies are units configured and deployed in .NET • Classes can be compiled and stored as a dynamic link library (DLL) instead of into the EXE file type • Adds a reference to the DLL – That referenced file with the .dll extension becomes part of the application’s private assembly C# Programming: From Problem Analysis to Program Design 16 Using Visual Studio to Create DLL Files Figure 10-6 Creating a DLL component C# Programming: From Problem Analysis to Program Design 17 Build Instead of Run to Create DLL • Create the parent class first in order to use IntelliSense • Create the subclass class in same way as usual, except Build instead of Run the project to create the DLL Figure 10-7 Attempting to run a class library file C# Programming: From Problem Analysis to Program Design 18 Add Reference to Base Class One of the first things to do is Add a Reference to the Parent DLL Figure 10-8 Adding a reference to a DLL C# Programming: From Problem Analysis to Program Design 19 Add Reference to Base Class (continued) Use Browse button to locate DLL Figure 10-9 Add Reference dialog box C# Programming: From Problem Analysis to Program Design 20 Add Reference to Base Class (continued) Figure 10-10 Locating the Person.dll component C# Programming: From Problem Analysis to Program Design 21 Adding a New Using Statement • In the subclass class, if you simply type the following, you receive an error message public class Student : Person Figure 10-11 Namespace reference error C# Programming: From Problem Analysis to Program Design 22 Adding a New Using Statement (continued) Notice • To avoid error, could type: public class Student : PersonNamespace.Person fully qualified name • Better option is to add a using directive using PersonNamespace; // Use whatever name you // typed for the namespace for Person • After typing program statements, build the DLL from the Build option under the Build menu bar C# Programming: From Problem Analysis to Program Design 23 Creating a Client Application To Use the DLL • DLL components can be reused with many different applications • Two Steps – Add a reference to the DLL components – Include a using statement with the namespace • Then declare an objects of the component type(s) • Use members of the derived, base, or referenced classes C# Programming: From Problem Analysis to Program Design 24 Creating a Client Application To Use the DLL (continued) Figure 10-12 DLLs referenced in the PresentationGUI class C# Programming: From Problem Analysis to Program Design 25 Creating a Client Application To Use the DLL (continued) Figure 10-13 PresentationGUI output referencing two DLLs C# Programming: From Problem Analysis to Program Design 26 Using ILDASM to View the Assembly • (ILDASM): Intermediate Language Disassembler tool • Assembly shows the signatures of all methods, data fields, and properties • One option – display the source code as a comment in the assembly • Can be run from the command line or from within the Visual Studio IDE – Must be added as an external tool in Visual Studio C# Programming: From Problem Analysis to Program Design 27 ILDASM to View the Assembly Data fields .ctors are constructors IL code for the method Properties converted to methods Figure 10-14 Student.dll assembly from ILDASM C# Programming: From Problem Analysis to Program Design 28 Abstract Classes • Used to prohibit other classes from instantiating objects of the base class • Still inherit characteristics from base class in subclasses • Base class can have data and method members [access modifier] abstract class ClassIdentifier { } // Base class C# Programming: From Problem Analysis to Program Design 29 Abstract Methods • Only permitted in abstract classes • Method has no body – Implementation details of the method are left up to classes derived from the base abstract class [access modifier] abstract returnType MethodIdentifier([parameter list]) ; // No { } included • Declaration for abstract method ends with semicolon; NO method body or curly braces C# Programming: From Problem Analysis to Program Design 30 Abstract Methods (continued) • Every class that derives from the abstract class must provide implementation details – Sign a contract that details how to implement its abstract methods – Syntax error if you use the keyword static or virtual when defining an abstract method • No additional special keywords are used when a new class is defined to inherit from the abstract base class C# Programming: From Problem Analysis to Program Design 31 Partial Classes • Break class up into two or more files – Each file uses partial class designation • New features of C# 2.0 • Used by Visual Studio for Windows applications – Code to initialize controls and set properties is placed in a somewhat hidden file in a region labeled “Windows Form Designer generated code” – File is created following a naming convention of “FormName.Designer.cs” or “xxx.Designer.cs” – Second file stores programmer code C# Programming: From Problem Analysis to Program Design 32 Interfaces • All .NET languages only support single inheritance • Think of an interface as a class that is totally abstract; all methods are abstract – Abstract classes can have abstract and regular methods – Implementing interface agrees to define details for all of the interface’s methods • Classes can implement any number of interfaces – Only inherit from one class, abstract or nonabstract C# Programming: From Problem Analysis to Program Design 33 Interfaces (continued) • General form [modifier] interface InterfaceIdentifier { // members - no access modifiers are used } • Members can be methods, properties, or events – No implementations details are provided for any of its members C# Programming: From Problem Analysis to Program Design 34 Defining an Interface • Can be defined as members of a namespace or class or by compiling to a DLL • Easy approach is to put the interface in a separate project – Use the Class Library template • Unlike abstract classes, it is not necessary to use the abstract keyword with methods – Because all methods are abstract C# Programming: From Problem Analysis to Program Design 35 Defining an Interface (continued) Build the interface DLL using Build option from Build menu bar C# Programming: From Problem Analysis to Program Design 36 Implement the Interface • Follow the same steps as with the Person and Student DLLs – Add a reference to the file ending in .dll – Type a using statement • Heading for the class definition specifies base class and one or more interfaces following the colon (:) [modifier] class ClassIdentifier : identifier [, identifier] • Base class comes first C# Programming: From Problem Analysis to Program Design 37 Implement the Interface: PresentationGUI Application Figure 10-16 PresentationGUI output using interface methods C# Programming: From Problem Analysis to Program Design 38 .NET Framework Interfaces • Play an important role in the .NET Framework – Collection classes such as Array class and HashTable class implement a number of interfaces C# Programming: From Problem Analysis to Program Design 39 .NET Framework Interfaces (continued) • .NET Array class is an abstract class – Implements several interfaces (ICloneable; IList; ICollection; and IEnumerable) – Includes methods for manipulating arrays, such as: • Iterating through the elements • Searching by adding elements to the array • Copying, cloning, clearing, and removing elements from the array • Reversing elements • Sorting C# Programming: From Problem Analysis to Program Design 40 NET Framework Interfaces (continued) • HashTable is not abstract – Implements a number of interfaces public class Hashtable : IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback, ICloneable • Implements the IDeserializationCallback interface • Explore the documentation for these classes and interfaces C# Programming: From Problem Analysis to Program Design 41 Polymorphism • Ability for classes to provide different implementations of methods called by the same name – ToString( ) method • Dynamic binding – Determines which method to call at run time based on which object calls the method C# Programming: From Problem Analysis to Program Design 42 Polymorphic Programming in .NET • Multiple classes can implement the same interface, each providing different implementation details for its abstract methods – “Black box” concept • Abstract classes, classes that derive from them, are forced to include implementation details for any abstract method C# Programming: From Problem Analysis to Program Design 43 Generics • Reduce the need to rewrite algorithms for each data type • Create generic classes, delegates, interfaces, and methods • Identify where data will change in the code segment by putting a placeholder in the code for the type parameters C# Programming: From Problem Analysis to Program Design 44 Generic Classes • Defined by inserting an identifier between left and right brackets on the class definition line • Example public class GenericClass <T> { public T dataMember; } – //To instantiate an object, replace the T with data type GenericClass <string> anIdentifer = new GenericClass <string>( ); C# Programming: From Problem Analysis to Program Design 45 Generic Methods • Similar to defining a generic class • Insert identifier between left and right brackets on the method definition line to indicate it is a generic method • Example public void SwapData <T> (ref T first, ref T second) { T temp; temp = first; first = second; second = temp; } //To call the method, specify the type following method name SwapData <string> (ref firstValue, ref secondValue); C# Programming: From Problem Analysis to Program Design 46 StudentGov Application Example Figure 10-18 Problem specification for StudentGov example C# Programming: From Problem Analysis to Program Design 47 StudentGov Application Example (continued) C# Programming: From Problem Analysis to Program Design 48 StudentGov Application Example (continued) Figure 10-19 Prototype for StudentGov example C# Programming: From Problem Analysis to Program Design 49 StudentGov Application Example (continued) Figure 10-20 Class diagrams for StudentGov example C# Programming: From Problem Analysis to Program Design 50 StudentGov Application Example (continued) Figure 10-21 References added to StudentGov example C# Programming: From Problem Analysis to Program Design 51 Properties: StudentGov Application C# Programming: From Problem Analysis to Program Design 52 Properties: StudentGov Application (continued) C# Programming: From Problem Analysis to Program Design 53 StudentGov Application Example (continued) Figure 10-22 Setting the StartUp Project C# Programming: From Problem Analysis to Program Design 54 StudentGov Application Example (continued) Figure 10-23 Part of the PresentationGUI assembly C# Programming: From Problem Analysis to Program Design 55 StudentGov Application Example (continued) Figure 10-24 Output from StudentGov example C# Programming: From Problem Analysis to Program Design 56 Chapter Summary • Major features of object-oriented languages – Abstraction – Encapsulation – Inheritance – Polymorphism • Multitier applications using component-based development methods C# Programming: From Problem Analysis to Program Design 57 Chapter Summary (continued) • Use inheritance to extend the functionality of userdefined classes • Abstract classes – Abstract methods • Partial classes • Interfaces C# Programming: From Problem Analysis to Program Design 58 Chapter Summary (continued) • Why polymorphic programming? • Generics – Generic Classes – Generic Methods C# Programming: From Problem Analysis to Program Design 59