500 likes | 665 Views
C# Classes in Depth Version 1.1. Topics. Designing Your Own Classes Attributes, Behaviors & Properties C# Class Definitions Creating and Using Objects. Objectives. At the completion of this topic, students should be able to:. Design classes for use in a C# program
E N D
Topics Designing Your Own Classes Attributes, Behaviors & Properties C# Class Definitions Creating and Using Objects
Objectives At the completion of this topic, students should be able to: Design classes for use in a C# program Explain the difference between a class and an object Explain what attributes, behaviors & properties are Explain the terms encapsulation and data hiding Create a program that uses a programmer designed class
Objects are used to model real-world things. Let’s consider an object that represents a time.
Real world objects have attributes An object’s attributes describe its “state of being” What things do we normally associate with the state of a time? minutes seconds am/pm hours
An object also has behaviors behaviors define how you interact with the object What can you do with a time? set a time display a time format a time
An object also has properties properties look like attributes, act like attributes, but are really behaviors with getters/setters. What can you do with a time via properties? set a time display a time format a time
An Object’s Attributes, Behaviors & Properties Should Work Together this is called cohesion
A instance Class is a blueprint that a program uses when it creates an object. A instance class reserves no space in memory When an object is created from and instance class blueprint, memory is reserved to hold the object’s attributes. An object is known as an instance of the class. Each object has it’s own space and data.
A class is said to be an abstraction of the real world object that we are modeling.
Encapsulation Time object DisplayTime( ) member methods & properties are declared as public calling method we should not allow code outside of the object to reach in and change the data directly. Instead, we call methods in the object to do it for us. hour minute second member data is declared as private public and private are called access modifiers
We use a UML Class Diagram to document the data and methods contained in our class.
A UML class diagramis used to describe a class in a very precise way. A class diagram is a rectangle. At the top of the rectangle is the class name. A line separates the class name from the rest of the diagram. Time public class Time { } code represented by the UML diagram
Time Following the class name we write the data members of the class. A line separates the data members from the rest of the diagram. - hour: int access modifier: + public - private public class Time { private int hour; } Code represented by the UML diagram data member name data type
Time Following the class name we write the data members of the class. A line separates the data members from the rest of the diagram. • hour: int • minute: int • second: int public class Time { private int hour; private int minute; private int second; } Code represented by the UML diagram
Time Following the data members, we write the member methods. • hour: int • minute: int • second: int public class Time { private int hour; private int minute; private int second; public void DisplayTime( ) { }; } Code represented by the UML diagram + DisplayTime( ): void access modifier + public - private method name return type parameters
Time Following the data members, we write the member methods. • hour: int • minute: int • second: int public class Time { private int hour; private int minute; private int second; public void DisplayTime( ) { }; public void SetTime(int, int, int) { }; } Code represented by the UML diagram + DisplayTime( ): void + SetTime(:int, :int, :int):void
It is important that class diagrams be drawn precisely and that they conform to the form shown in these examples.
To start a class definition The class name we have chosen The keyword “class” The keyword public public class Time { } A set of curly braces … The body of the class will go in between them.
Declaring Member Data Member data is always “private” public class Time { private int hour; } Indent each line inside the block variable name data type
Declaring Member Data public class Time { private int hour; } We call data members of a class “Instance Data” because each instance (object) of the class will contain its own unique copy of this data.
Declaring Member Data public class Time { private int hour; private int minute; private int second; }
Declaring Member Methods public class Time { private int hour; private int minute; private int second; public void SetTime( int hr, int min, int sec) { } } Member methods are usually public parameters method name return type
Declaring Member Methods public class Time { private int hour; private int minute; private int second; public void SetTime( int hr, int min, int sec) { } } The body of the method goes between these curly braces
Don’t Forget the Method Prologue public class Time { private int hour; private int minute; private int second; public void SetTime( int hr, int min, int sec) { hour = hr; minute = min; second = second; } } // The SetTime method // Purpose: Set the time values // Parameters: an hour, minute and second value // Returns: none
“Setter”Methods they are usually named “set” plus the name of the instance variable they will return the value of. public class Time { . . . public void SetHour(int hr) { hour = hr; } } setters never return anything setters always take a parameter
“Getter”Methods they are usually named “get” plus the name of the instance variable they will return the value of. public class Time { . . . public intGetHour( ) { return hour; } } getters always return something getters take no parameters
The methods public void SetTime(int, _hr, int _min, int _sec) public void DisplayTime( ) etc . . . are the public services or the public interface that this class offers to its clients. Clients are neither aware of nor involved in the implementation details of these methods. Clients care what a method does, but not how it does it.
The data members (or fields) in the Time class private int hour; private int minute; private int second; are all declared as private. This hides the data from a client. Clients must use the public interface to access any data. This is known as information hiding. Getters and setters provide a controlled way for programmer’s to retrieve or modify the contents of a data member. These are provided as a property in the class.
Properties C# provides an elegant way of accessing data members of a class by using properties. Properties contain code that handles the details of getting and/or setting the values of a data member. After defining a property you can use it just like a data member of the class in your code.
Properties You have already see some properties in C# For example, the Length property of an array.
Let’s replace the getters and setterswith properties. public class Time { // data members private int hour; . . . public int Hour { get { return hour; } set { if (value < 0 || value > 23) hour = value; else { Console.WriteLine(“Invalid hour value, hour was set to 1”); hour = 1; } }
Get Accessor private int hour; . . . public int Hour { get { return hour; } set { if (value < 0 || value > 23) { Console.WriteLine("Invalid hour value, hour was set to 1"); hour = 1; } else hour = value; } } Note the difference in capitalization. The keyword “get” is called a property accessor. When a property is read, the get accessor code is executed. It must return a value of the property’s type.
Set Accessor private int hour; . . . public int Hour { get { return hour; } set { if (value < 0 || value > 23) { Console.WriteLine("Invalid hour value, hour was set to 1"); hour = 1; } else hour = value; } } When a property is assigned, the set accessor code is executed. It provides complete control over the how the value of a property is set. value is the number assigned to the property.
To Use a Property Time time1 = new Time( ); time1.Hour = 5; //set accessor called Console.WriteLine(time1.Hour); //get accessor called
Why Should I Use Properties? Properties provide a simple controlled way of accessing private data. Suppose that in our Time class we decided to store a time as the number of seconds past midnight. Without changing the public interface, we could support time this way by altering the get and set accessors as shown:
private int _secondsPastMidnight; const int _SECONDS_PER_MINUTE = 60; const int _MINUTES_PER_SECOND = 60; . . . public int Hour { get { return _secondsPastMidnight / _SECONDS_PER_MIN / _MINUTES_PER_HOUR; } set { if (value < 0 || value > 23) { Console.WriteLine("Invalid hour value, hour was set to 1"); _hour = _MINUTES_PER_HOUR * _SECONDS_PER_MINUTE; } else _hour = _value * _MINUTES_PER_HOUR * _SECONDS_PER_MINUTE } }
Note that a Property is not a variable, and so you cannot pass a property by reference.
Automatic Properties The most common implementation for a property is just a getter and a setter that reads and writes to a private data field in the class. The compiler will automatically create the associated data field when you write the property this way: public int Hour{get; set;}
Read Only Properties A property is read only when it only has a get accessor and NO set accessor. It is possible to have a write only property (NO get accessor), but they are rarely used.
Read Only Data Up until this point in time we have used constants to represent data that we don’t want to change inside of an application. The problem with a constant is that it is defined at compile time. What if we want to have a data member of a class that we want to treat as constant, but we want to be able to initialize this data member in the class constructor? To do this, use the readonly keyword … private readonlyint INCREMENT; The constructor can assign a value to INCREMENT . The data is not considered unchangeable until after the constructor completes execution.
Static Data Every instance object has its own copy of all of the instance variables in a class. What if you want to have all objects of a class share a single instance of a variable? For example, all savingsAccount objects might have the same interest rate. To do this, declare the variable as private static double interestRate = 0.0725; static variables and methods have NO associated this variable
The this reference Every instance object contains a variable named this, that is a reference to itself. The keyword is often used when you want to explicitly name a variable as a data member of this object. For example, in the Time class we have discussed is a method public void SetTime( int hr, int min, int sec) { hour = hr; minute = min; second = sec; }
The this reference Using the this reference we could write: public void SetTime( int hr, int min, int sec) { this.hour = hr; this.minute = min; this.second = sec; }
Class definition Time startTime = new Time( ); public class Time { private int hour; private int minute; private int second; . . . } this statement takes the Time class definition and uses it to create the object “startTime”. When creating the object, storage is allocated for the each of the data members defined in the class. Each data member is initialized to a standard default value. Hour Minute second startTime
parameter startTime.SetHour(8) ); message . object name method name hour minute second startTime
parameter startTime.SetHour(8) ); This statement send the SetHour message to the object named startTime. As the method executes, the value of the parameter hr is stored in the instance variable hour. message message hour minute second startTime void SetHour(int hr) { hour = hr; }