610 likes | 885 Views
:: OOP :: Object Oriented Programming Lec10 :: Overloading By Nattapong Songneam http://www.siam2dev.com Information technology Rajabhat pranakhon university. Class Design in Java Overloading Programming with Multiple Classes Inheritance Inheritance and Access Control.
E N D
:: OOP :: Object Oriented ProgrammingLec10 :: OverloadingBy Nattapong Songneamhttp://www.siam2dev.comInformation technologyRajabhat pranakhon university
Class Design in Java Overloading Programming with Multiple Classes Inheritance Inheritance and Access Control Object Oriented Programming Nattapong Songneam
publicvoid deposit(double amount); publicvoid deposit(int amount); publicvoid deposit(double amount, double interest); publicboolean deposit(double amount); Overloading Methods • การประกาศเมทธอดซ้ำซ้อน (Overloading Methods) • คือ วิธีการเชิงวัตถุ ที่มีไว้เพื่อนำชื่อเมทธอด (Methods Name) กลับมาใช้ใหม่ (reuse) • ภาษาโปรแกรมจาวาสนับสนุน Overloading Methods โดย • อนุญาตให้ประกาศเมทธอดที่มีชื่อเดียวกันซ้ำกันได้ แต่มีเงื่อนไขดังนี้ • ชนิด หรือ จำนวน หรือ ลำดับของ argument จะต้องต่างกัน • return type ของเมทธอดจะเหมือนกัน หรือแตกต่างกันก็ได้
public BankAccount (double initAmount) {/*…*/ } public BankAccount (String customerName){/*…*/ } public BankAccount ( ) { /*…*/ } public BankAccount (double initAmount, String customerName) {/*…*/ } Overloading Constructors • การประกาศคอนสตรัคเตอร์ซ้ำซ้อน (Overloading Constructors) • คือ วิธีการเชิงวัตถุ ที่มีไว้เพื่อเพิ่มความยืดหยุ่นให้กับการสร้างวัตถุ กรณีที่ไม่สามารถกำหนดข้อมูลเริ่มต้นที่แน่นอน ในขณะสร้างวัตถุ • ภาษาโปรแกามจาวาสนับสนุน Overloading Constructors โดย • อนุญาตให้ประกาศคอนสตรัคเตอร์ที่มีชื่อเดียวกันซ้ำกันได้ โดยมีเงื่อนไขดังต่อไปนี้ • ชนิดหรือ จำนวน หรือ ลำดับของ argument จะต้องต่างกัน
การกำหนดคอนสรัคเตอร์ซ้ำการกำหนดคอนสรัคเตอร์ซ้ำ ซ้อน มีประโยชน์ในกรณีที่ ไม่สามารถกำหนดค่าจำนวน เงินฝากเริ่มต้นเมื่อเปิดบัญชี ทำให้การใช้งานโปรแกรม มีความยืดหยุ่น นำชื่อเมทธอดกลับมาใช้ไหม่ โดยระบุ “ชนิด” ของ Argument เป็นประเภทข้อมูลที่แตกต่างกัน An Example of Overloading • public class OverLoadedBankAccount { • private double balance; • public OverLoadedBankAccount( ) { • balance = 0.0; • } • public OverLoadedBankAccount(double intBalance) { • balance = initBalance; • } • public void deposit(int amount) { • balance = balance + amount; • } • public void deposit(double amount) { • balance = balance + amount; • } • }
BankAccount Example publicclass OverLoadedAccountTester { publicstaticvoid main(String[] args) { BankAccount myAccount = new BankAccount2(); BankAccount yourAccount = new BankAccount2(100.0); myAccount.deposit(5000.50); myAccount.withdrawn(2000); System.out.println("my balance:" +myAccount.getBalance()); yourAccount.deposit(300.50); yourAccount.withdrawn(200); System.out.println("your balance:” + yourAccount.getBalance()); } } public class BankAccount2 { private double balance; public BankAccount2( ) { balance = 0.0; } public BankAccount2(double intBalance) { balance = initBalance; } public void deposit(int amount) { balance = balance + amount; } public void deposit(double amount) { balance = balance + amount; } : OverLoadedTester.java OverloadedBankAccount.java
Aggregation Association Name Direction indicator Multiplicity Class Diagram with Multiple Classes Customer BankAccount account - firstName : String - balance : double - lastName : String 1 - account : BankAccount + BankAccount(initBalance:double) + getBalance : double + Customer(f:String, l:String) + deposit(amt : double) + getFirstName : String + withdraw(amt : double) + getLastName : String + setAccount( acct:BankAccount) + getAccount( ) : BankAccount Class Diagram of “Customer.java” and “BankAccount.java”
Customer Class public class Customer { private String firstName; private String lastName; private BankAccount account; public Customer(String f, String l) { this.firstName = f; this.lastName = l; this.account = null; } public String getName() { return (this.firstName + " " + this.lastName); } public BankAccount getAccount() { returnthis.account; } publicvoid setAccount(BankAccount acct) { this.account = acct; } }
BankAccount Class publicclass BankAccount { privatedouble balance = 0.0; public BankAccount(double amount) { balance = amount; } publicvoid deposit(double amount) { balance = balance + amount; } publicvoid withdrawn(double amount) { balance = balance - amount; } publicdouble getBalance() { return balance; } }
Programming with Multiple Classes publicclass TestBanking { publicstaticvoid main(String[] args) { Customer cust = new Customer("Joe","Goodman"); cust.setAccount(new BankAccount(3000.0);); System.out.println("customer : " + cust.getName() + " : open account with balance = " + cust.getAccount().getBalance() + " baht."); cust.getAccount().deposit(1250.25); System.out.println("customer : " + cust.getName() + " : deposit 1250.25 baht :" + " current balance = " + cust.getAccount().getBalance() + " baht."); } }
cust Customer firstName=“John” lastName=“Goodman” account=null getName getAccount setAccount Programming with Multiple Classes Object Diagram of “TestBanking.java”“Customer.java” and “BankAccount.java” TestBanking main Class Diagram MyDate.java After Line 3
acct cust Customer acct acct firstName=“John” BankAccount BankAccount lastName=“Goodman” balance=3000.0 balance=3000.0 account=null account=acct getName deposit deposit getAccount withdraw withdraw setAccount getBalance getBalance Programming with Multiple Classes TestBanking main Executing Line 4 Class Diagram MyDate.java
cust Customer acct firstName=“John” BankAccount lastName=“Goodman” balance=3000.0 account=acct getName deposit getAccount withdraw setAccount getBalance Programming with Multiple Classes TestBanking main After Line 4 Class Diagram MyDate.java
cust Customer acct firstName=“John” BankAccount lastName=“Goodman” balance=3000.0 balance=4250.25 account=acct 1250.25 getName deposit getAccount withdraw setAccount getBalance Programming with Multiple Classes TestBanking deposit(1250.25) main Executing Line 6 Class Diagram MyDate.java
Programming with Multiple Classes cust Customer acct firstName=“John” BankAccount lastName=“Goodman” balance=4250.25 account=acct getName deposit getAccount withdraw setAccount getBalance TestBanking main After Line 6 Class Diagram MyDate.java
Customer BankAccount account - firstName : String - balance : double - lastName : String * + BankAccount(initBalance:double) - account : BankAccount [] + getBalance : double + Customer(f:String, l:String) + deposit(amt : double) + getFirstName : String + withdraw(amt : double) + getLastName : String + setAccount( acct:BankAccount) + getAccount( ) : BankAccount “account” is an array of BankAccount Multiplicity Class Diagram with Multiple Classes Class Diagram of “Customer.java” and “BankAccount.java”
Inheritance • การรับถ่ายทอดคุณสมบัติ (Inheritance) • หมายถึง การที่คลาสหนึ่งๆ รับถ่ายคุณสมบัติ (inherit) ทั้งค่าคุณลักษณะ (Attribute) และพฤติกรรม (Method) มาจากอีกคลาสหนึ่ง • แต่ไม่รวมถึง คอนสตรัคเตอร์ (Constructor)
รับถ่ายทอดคุณสมบัติ (inherit) Inheritance Class Diagram of “BankAccount” class and “SavingsAccount” class
public class Employee { public String name; public double salary; public MyDate birthDate; public String getDetails( ) { … } } Subclassing • พิจารณาคลาส Employee • เราสามารถสร้างวัตถุที่มีคลาสเป็นพนักงาน ได้โดยการกำหนดคลาส “Employee” • ถ้าเราต้องการสร้างคลาสของ “Manager” ที่ยังคงคุณสมบัติเป็น “Employee” คนหนึ่ง แต่มีคุณสมบัติบางอย่างเพิ่มเติม
public class Manager { public String name; public double salary; public MyDate birthDate; public String department; public String getDetails( ) { … } } Subclassing • พิจารณาคลาส Manager • โครงสร้างคลาส “Manager” กับ “Employee” ซ้ำซ้อนกัน • เราใช้วิธีการเชิงวัตถุสร้างคลาสใหม่ จากคลาสเดิมที่มีอยู่แล้ว วิธีการนี้เราเรียกว่า “Subclassing”
Subclassing • UML Diagram • การสร้างคลาสใหม่จากคลาสเดิมที่มีอยู่แล้ว สนับสนุนแนวคิด ของการนำ Source Code กลับมาใช้ใหม่
Inheritance • การรับถ่ายทอดคุณสมบัติ (Inheritance) • หมายถึง การที่คลาสหนึ่งๆ รับถ่ายคุณสมบัติ (inherit) ทั้งค่าคุณลักษณะ (Attribute) และพฤติกรรม (Method) มาจากอีกคลาสหนึ่ง • แต่ไม่รวมถึง คอนสตรัคเตอร์ (Cosntructor) • คือการที่ class ที่ต่างกันมี Attributes และ Methods ที่เหมือนกัน
Single Inheritance • Single Inheritance • หมายถึง การที่คลาสหนึ่งๆ รับถ่ายทอดคุณสมบัติ (inherit) ทั้ง Attribute และ Method มาจากอีกคลาสหนึ่ง • เราเรียกว่าคลาส “Manager” รับถ่ายทอดคุณสมบัติ (inherit) มาจาก คลาส “Employee”
Multiple Inheritance • Multiple Inheritance • หมายถึง การที่คลาสหนึ่งๆ รับถ่ายทอดคุณสมบัติ (inherit) ทั้งค่าคุณลักษณะ และพฤติกรรมมาจากคลาสมากกว่า 1 คลาส • ภาษาจาวา • ไม่สนับสนุนการทำ Multiple Inheritance • แต่สามารถรับสืบทอดคุณสมบัติจากหลายคลาสได้โดยใช้ “Interface”
public class Employee { public String name; public double salary; public MyDate birthDate; public String getDetails( ) { … } } Java Inheritance • UML Diagram • จาวา public class Manager extends Employee { public String department; }
Defining Extending Class in Java • การกำหนดคลาสที่รับคุณสมบัติสืบทอดในภาษาจาวา สามารถทำได้ดังนี้ <modifier> class child-class extends parent-class { : } • ตัวอย่าง public class Manager extends Employee { publicString department; }
“super” and “this” keyword • “this” keyword • ใช้อ้างอิงถึงคลาสปัจจุบัน • สามารถใช้อ้างอิงถึง Attribute หรือ Method ของคลาสปัจจุบัน ได้โดยใส่ . แล้วตามด้วยชื่อ Attribute หรือ ชื่อ Method • “super” keyword • ใช้อ้างอิงถึง superclass ของคลาสปัจจุบัน • super( ) อ้างอิงถึง constructor ของ superclass • super.method( ) อ้างอิงถึง method ของ superclass
Top-Middle-Bottom (1) class Top { public Top( ) { System.out.println("Top()"); } } class Middle extends Top { public Middle( ) { System.out.println("Middle()"); } } class Bottom extends Middle { public Bottom( ) { System.out.println("Bottom()"); } } public class Tester1 { public static void main(String[] args) { new Bottom(); } }
Top-Middle-Bottom (2) class Top { public Top( ) { System.out.println("Top()"); } } class Middle extends Top { public Middle( ) { super( ) ; System.out.println("Middle()"); } } class Bottom extends Middle { public Bottom( ) { super( ); System.out.println("Bottom()"); } } public class Tester2 { public static void main(String[] args) { new Bottom(); } }
Overriding Methods • subclass/child class สามารถเปลี่ยนแปลงพฤติกรรม ที่รับถ่ายทอด (inherit) มาจาก superclass/parent class ได้ • subclass สามารถกำหนด Method ที่มีหน้าที่/พฤติกรรม ต่างจาก Method ของ superclass ได้แต่ต้องมีสิ่งต่อไปนี้ที่เหมือนกัน • Method Name • Return Type • Argument list
Overriding Method (1) public class Employee { publicString name; public double salary; publicString birthDate; public Employee(String n, double s, MyDate bd) { name = n; salary = s; birthDate = bd; } public String getDetails( ) { return "name:"+name+",salary:"+salary +"bd:"+birthDate.toString(); } }
Overriding Methods (2) public class Manager extends Employee { publicString department; public Manager(String n, double s, MyDate bd, String dept) { name = n; salary = s; birthDate = bd; department = dept; } public String getDetails( ) { return "name:"+name+",salary:"+salary +"bd:"+birthDate.toString() + +", department:"+this.department; } }
Super & Overriding Methods public class Manager extends Employee { publicString department; public Manager(String n, double s, MyDate bd, String dept) { name = n; salary = s; birthDate = bd; department = dept; } public String getDetails( ) { return super.getDetails() +", department:"+this.department; } }
Super & Overriding Methods public class Manager extends Employee { publicString department; public Manager(String n, double s, MyDate bd, String dept) { super(n, s, bd); department = dept; } public String getDetails( ) { return super.getDetails() +", department:"+this.department; } }
TestCompany public class TestCompany { publicstatic void main(String[] args) { Employee jeff = new Employee( "Jeffrey" , 3000.0 , new MyDate(2, 3, 1970) ); Manager rob = new Manager(" Robert" , 5000.0 , new MyDate(3, 4, 1965) , ”Sales"); System.out.println(jeff.getDetails( )); System.out.println(rob.getDetails( )); } } “TestCompany.java”
jeff rob Employee Manager name=“Jeffrey” jeffdate robdate name=“Robert” Salary=1000.0 MyDate MyDate Salary=5000.0 birthday=jeffdate day=2; birthday=Robdate day=3; getDetails month=3; month=4; department=“Sales” year=1970; year=1965; setDate setDate getDetails toString toString Employee & Manger Example TestCompany main Class Diagram MyDate.java
Access Control • การควบคุมการเข้าถึงข้อมูล (Access Control) • คือ วิธีการเชิงวัตถุ ที่ภาษาจาวามีไว้เพื่อ ใช้เขียนโปรแกรมสนับสนุนคุณสมบัติ Encapsulation และ Information Hiding • การระบุค่า Access Control Specifier เป็นการควบคุมการเข้าถึงข้อมูล โดยจะใช้ระบุก่อนหน้า ตัวแปร ค่าคงที่เมทธอด และคลาส • ค่า Access Control Specifier ได้แก่ • public- เปิดให้เข้าถึงข้อมูลได้จากทุกๆที่ • private- เปิดให้เข้าถึงข้อมูลได้ภายในขอบเขตที่กำหนด • protected- เปิดให้เข้าถึงข้อมูลได้จากการสืบทอดคุณสมบัติ
public ประกาศการเข้าถึงข้อมูล ของคอนสตรัคเตอร์ของ คลาสเป็นpublicเพื่อให้ ผู้ขอใช้บริการจากวัตถุที่ ถูกสร้างขึ้นจากวัตถุนี้ สามารถสร้างวัตถุนี้ได้ ประกาศการเข้าถึงข้อมูล ของตัวแปรภายในคลาส เป็นprivateเพื่อให้สามารถ เข้าถึงได้จากภายในคลาส ประกาศการเข้าถึงข้อมูล ของเมทธอดเป็นpublic เพื่อให้เมทธอดของคลาส สามารถให้บริการแก่ผู้ขอ ใช้บริการนอกขอบเขตของ คลาส Note: กรณีที่ประกาศการเข้าถึง ข้อมูลของคลาสเป็นpublicคลาสนั้น จะต้องถูกบันทึกในไฟล์ที่มือชื่อเดียวกับ คลาส “BankAccout.java”แยกจาก ไฟล์ที่ระบุผู้สร้างวัตถุจากคลาส หรือ ขอรับบริการจากคลาสนี้ An Example of Access Control • class BankAccount { • private double balance; • public BankAccount(double initAmount) { • balance = initAmount; • } • public void deposit(double amount) { • balance = balance + amount; • } • public void withdrawn(double amount) { • balance = balance - amount; • } • public int getBalance() { • return balance; • } • }
Inheritance & Access Control • พิจารณา • การระบุค่าการเข้าถึงข้อมูล (Access Control) ให้เป็น public ทำให้คลาสอื่นๆ ทุกคลาส สามารถเข้าถึง Attributes ของคลาส Employee ได้ • ถ้าต้องการให้เฉพาะคลาส Manager สามารถเข้าถึง Attributes ของ Employee จะทำอย่างไร?
protected Inheritance & Access Control • พิจารณา • สามารถกำหนดเข้าถึงข้อมูล (Access Control) ให้สามารถเข้าถึงได้ผ่านทางการสืบทอดคุณสมบัติเท่านั้น • ทำได้โดยระบุค่า Access Control Specifierเป็น protected
Employee & Manager Example public class Employee { protectedString name; protecteddouble salary; public String getDetails( ) { return ("name:"+name+ ”, salary:"+salary); } } public class Manager extends Employee { privateString department; public String getDetails( ) { return super.getDetails( ) + ", departmentt:"+department); } }
“Point” Class public class public class Point { protectedint x,y; public Point() { setPoint(0, 0); } public Point(int a, int b) { setPoint(a, b); } public void setPoint(int a, int b) { x = a; y = b; } publicint getX() { return x; } publicint getY() { return y; } publicString toString() { return "("+x+","+y+")"; } }
“Circle” Class public class Circle extends Point { protecteddouble radius; public Circle() { setRadius(0.0); } public Circle(double r, int a, int b) { super(a , b); setRadius(r); } publicvoid setRadius(double r) { radius = r; } publicdouble getRadius() { return radius; } publicdouble area() { return Math.PI * radius * radius; } publicString toString() { return "Center = "+"("+ x +","+ y +")" +"; Radius = "+ radius; } }
“Cylinder” Class public class Cylinder extends Circle { protected double height; public Cylinder() { setHeight(0); } public Cylinder(double r, double h, int a, int b) { super(r, a , b); setHeight(h); } publicvoid setHeight(double h) { height = h; } publicdouble getHeight() { return height; } publicdouble area() { return 2 * super.area() +2 * Math.PI * radius * height; } publicString toString() { return super.toString()+ "; Height = " + height; } }
“TestInheritance” Class public class TestInheritance { public static void main(String[] args) { Cylinder c = new Cylinder(5.7, 2.5, 12, 23); System.out.println("X coordinate is "+ c.getX() + "\nY coordinate is "+ c.getY() + "\nRadius is "+ c.getRadius() +"\nHeight is ”+ c.getHeight() +"\nCylinder Area = "+ c.area()); c.setHeight(10); c.setRadius(4.25); c.setPoint(2,2); System.out.println("\n\nThe new Location : "+ "\nX coordinate is "+ c.getX() + "\nY coordinate is "+ c.getY() + "\nRadius is "+ c.getRadius() +"\nHeight is ”+ c.getHeight() + "\nCylinder Area = "+ c.area()); }
Object Diagram of TestInheritance TestInheritance main c Cylinder x = 12 radius = 5.7 y = 23 height = 2.5 getX setRadius getY setHeight getRadius setPoint getHieght area toString
Specialization • Subclass/Child Class รับถ่ายทอดคุณสมบัติ (inherit) ทั้ง Attributes และ Methods มาจาก Superclass/Parent Class Employee Manager