Review of Object-Oriented Programming

advertisement
Lecture 7
Object Oriented Programming Review
Richard Gesick
CSE 1302
Topics
•
•
•
•
•
•
Identifying Classes & Objects
Static Members
Class Relationships
“this”
Parameters Revisited
Overloading
– Methods
– Operators
• Testing
CSE 1302
Identifying Classes & Objects
• Identify potential classes within the
specification
• Nouns
CSE 1302
In Gaming…
• How do you identify the classes within a
game?
• What have you seen so far in labs and
assignments?
CSE 1302
What Goes in the Class
• How do you decide what should be in the
class
– Data
– Methods
• Not easy, but must be done
CSE 1302
Static Members
• Static methods can be invoked via the class
name
• Static variables are stored at the class level
(one copy for all instances)
CSE 1302
The static Modifier
• Remember that static methods (also called class methods) that
can be invoked through the class name rather than through a
particular object
• For example, the methods of the Math class are static:
Math.sqrt (25)
• To write a static method, we apply the static modifier to the
method definition
• The static modifier can be applied to variables as well
• It associates a variable or method with the class rather than with
an object
CSE 1302
Static Variables
• Static variables are also called class variables
• Normally, each object has its own data space, but if a variable
is declared as static, only one copy of the variable exists
private static int count;
• Memory space for a static variable is created when the class in
which it is declared is loaded
• All objects created from the class share static variables
• Changing the value of a static variable in one object changes it
for all others
• Local variables cannot be static
CSE 1302
Static Methods
class Helper
public static int triple (int num)
{
int result;
result = num * 3;
return result;
}
Because it is static, the method can be invoked as:
value = Helper.triple (5);
CSE 1302
Static Methods
• Static methods cannot reference instance
variables, because instance variables don't
exist until an object exists
• However, a static method can reference static
variables or local variables
CSE 1302
Class Relationships
Classes can have various relationships to
one another. Most common are:
• Dependency (“uses”)
• Aggregation (“has a”)
• Inheritance (“is a”)
CSE 1302
Object Relationships
• Objects can have various types of relationships to each other
• A general association, as we've seen in UML diagrams, is
sometimes referred to as a use relationship
• A general association indicates that one object (or class) uses or
refers to another object (or class) in some way
• We could even annotate an association line in a UML diagram to
indicate the nature of the relationship
Author
CSE 1302
writes
Book
Dependency
• One class dependent (uses) another class
– Game uses ball, paddle
– Ship uses bullet
• Sometimes, a class depends on another
instance of itself
– Is one date equal to another date?
– Is one picture equal to another picture?
CSE 1302
Aggregation
• One class is “made up” of other classes
• “has a” relationship
– Gameboard has a marble
– Deck has a card
CSE 1302
Aggregation
• An aggregate object is an object that contains
references to other objects
• For example, an Account object contains a reference
to a String object (the owner's name)
• An aggregate object represents a has-a relationship
• A bank account has a name
• Likewise, a student may have one or more addresses
CSE 1302
Aggregation in UML
• An aggregation association is shown in a UML
class diagram using an open diamond at the
aggregate end
StudentBody
+ Main (args : String[]) :
void
Address
- streetAddress : String
- city : String
- state : String
- zipCode : long
+ ToString() : String
CSE 1302
1
2
Student
- firstName : String
- lastName : String
- homeAddress : Address
- schoolAddress : Address
+ ToString() : String
The this Reference
• The this reference allows an object to refer to itself
• That is, the this reference, used inside a method, refers to the
object through which the method is being executed
• Suppose the this reference is used in a method called tryMe
• If tryMe is invoked as follows, the this reference refers to
obj1:
obj1.tryMe();
• But in this case, the this reference refers to obj2:
obj2.tryMe();
CSE 1302
The this reference
• The this reference can also be used to
distinguish the parameters of a constructor
from the corresponding instance variables
with the same names
public Account (String name, long acctNumber,
double balance)
{
this.name = name;
this.acctNumber = acctNumber;
this.balance = balance;
}
CSE 1302
Assignment Revisited
• The act of assignment takes a copy of a value and stores
it in a variable
• For primitive types:
num2 = num1;
Before
CSE 1302
After
num1
num2
num1
num2
5
12
5
5
Reference Assignment
• For object references, assignment copies the memory location:
bishop2 = bishop1;
Before
bishop1
CSE 1302
bishop2
After
bishop1
bishop2
Aliases
• Two or more references that refer to the same
object are called aliases of each other
• One object (and its data) can be accessed using
different reference variables
• Aliases can be useful, but should be managed
carefully
• Changing the object’s state (its variables) through
one reference changes it for all of its aliases
CSE 1302
Parameters
There are three main types of parameters:
1. Value - passes a copy (value) of the variable to the method. This
is the default.
2. Reference - passes a reference to the actual variable. Marked
with "ref", use this when you want to pass a value in and have
any change to that value be persistent when the method is
complete
3. Out - passes a reference to the actual variable. Marked with
"out", use this when you want the method to generate a value
and place it for later use in the actual variable (persists when the
method is complete)
CSE 1302
Example 1 and the output is ?
static void Main()
{
int a = 42;
Console.WriteLine (a);
B (a);
Console.WriteLine (a);
}
static void B (int x)
{
x += 9;
Console.WriteLine (x);
}
CSE 1302
Example 2 and the output is ?
static void Main()
{
int a = 42;
Console.WriteLine (a);
B (ref a);
Console.WriteLine (a);
}
static void B (ref int x)
{
x += 9;
Console.WriteLine (x);
}
CSE 1302
Example 3 and the output is ?
static void Main()
{
int a;
B (out a);
Console.WriteLine (a);
}
static void B (out int x)
{
x = 9;
Console.WriteLine (x);
}
CSE 1302
Example 4 and the output is ?
class Z
{ public int y; }
static void Main()
{
Z myZ = new Z();
myZ.y = 42; Console.WriteLine (myZ.y);
B (myZ);
Console.WriteLine (myZ.y);
}
static void B (Z x)
{
x.y += 9;
Console.WriteLine (x.y);
}
CSE 1302
Example 5 and the output is ?
class Z
{ public int y; }
static void Main()
{
Z myZ = new Z();
myZ.y = 42; Console.WriteLine (myZ.y);
B (ref myZ);
Console.WriteLine (myZ.y);
}
static void B (ref Z x)
{
x = new Z();
x.y = 1;
Console.WriteLine (x.y);
}
CSE 1302
• Be careful to note the difference between a
pass-by-reference parameter and a parameter
of a reference type.
• Use the activation stack to track local variables
and how parameters of the above types affect
the variables from one stack frame to the
next.
CSE 1302
Overloading Methods
• Method overloading is the process of using the same method
name for multiple methods
• The signature of each overloaded method must be unique
• The signature includes the number, type, and order of the
parameters
• The compiler determines which version of the method is
being invoked by analyzing the parameters
• The return type of the method is not part of the signature
CSE 1302
Overloading Methods
Version 1
Version 2
float tryMe (int x)
{
return x + .375;
}
float tryMe (int x, float y)
{
return x*y;
}
Invocation
result = tryMe (25, 4.32f)
CSE 1302
Overloading Operators
• In C#, not only can methods be overloaded,
operators can be overloaded as well.
CSE 1302
CSE 1302
•Operator overloading
• C# enables you to overload most operators to make
them sensitive to the context in which they are used.
• Use operator overloading when it makes an
application clearer than accomplishing the same
operations with explicit method calls.
• Class ComplexNumber overloads the plus (+),
minus (-) and multiplication (*) operators to enable
programs to add, subtract and multiply instances of
class ComplexNumber using common mathematical
notation
CSE 1302
Operator Overloading
• Keyword operator, followed by an operator
symbol, indicates that a method overloads the
specified operator.
• Methods that overload binary operators must
take two arguments—the first argument is the
left operand, and the second argument is the
right operand.
• Overloaded operator methods must be
public and static.
CSE 1302
1
// Fig. 12.17: ComplexNumber.cs
2
3
// Class that overloads operators for adding, subtracting
// and multiplying complex numbers.
4
5
6
7
using System;
public class ComplexNumber
{
8
9
10
11
// read-only property that gets the real component
public double Real { get; private set; }
12
13
14
15
16
public double Imaginary { get; private set; }
17
18
19
Real = a;
Imaginary = b;
} // end constructor
// read-only property that gets the imaginary component
// constructor
public ComplexNumber( double a, double b )
{
CSE 1302
20
21
// return string representation of ComplexNumber
22
23
24
public override string ToString()
{
return string.Format( "({0} {1} {2}i)",
Real, ( Imaginary < 0 ? "-" : "+" ), Math.Abs( Imaginary ) );
25
26
27
} // end method ToString
28
29
// overload the addition operator
public static ComplexNumber operator +(
30
31
32
33
ComplexNumber x, ComplexNumber y )
34
35
{
return new ComplexNumber( x.Real + y.Real,
x.Imaginary + y.Imaginary );
} // end operator +
CSE 1302
Overload the plus
operator (+) to perform
addition of
ComplexNumbers
Download