1 / 60

Class Design in Java Overloading Programming with Multiple Classes Inheritance Inheritance and Access Control

:: 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.

ura
Download Presentation

Class Design in Java Overloading Programming with Multiple Classes Inheritance Inheritance and Access Control

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. :: OOP :: Object Oriented ProgrammingLec10 :: OverloadingBy Nattapong Songneamhttp://www.siam2dev.comInformation technologyRajabhat pranakhon university

  2. Class Design in Java Overloading Programming with Multiple Classes Inheritance Inheritance and Access Control Object Oriented Programming Nattapong Songneam

  3. 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 ของเมทธอดจะเหมือนกัน หรือแตกต่างกันก็ได้

  4. public BankAccount (double initAmount) {/*…*/ } public BankAccount (String customerName){/*…*/ } public BankAccount ( ) { /*…*/ } public BankAccount (double initAmount, String customerName) {/*…*/ } Overloading Constructors • การประกาศคอนสตรัคเตอร์ซ้ำซ้อน (Overloading Constructors) • คือ วิธีการเชิงวัตถุ ที่มีไว้เพื่อเพิ่มความยืดหยุ่นให้กับการสร้างวัตถุ กรณีที่ไม่สามารถกำหนดข้อมูลเริ่มต้นที่แน่นอน ในขณะสร้างวัตถุ • ภาษาโปรแกามจาวาสนับสนุน Overloading Constructors โดย • อนุญาตให้ประกาศคอนสตรัคเตอร์ที่มีชื่อเดียวกันซ้ำกันได้ โดยมีเงื่อนไขดังต่อไปนี้ • ชนิดหรือ จำนวน หรือ ลำดับของ argument จะต้องต่างกัน

  5. การกำหนดคอนสรัคเตอร์ซ้ำการกำหนดคอนสรัคเตอร์ซ้ำ ซ้อน มีประโยชน์ในกรณีที่ ไม่สามารถกำหนดค่าจำนวน เงินฝากเริ่มต้นเมื่อเปิดบัญชี ทำให้การใช้งานโปรแกรม มีความยืดหยุ่น นำชื่อเมทธอดกลับมาใช้ไหม่ โดยระบุ “ชนิด” ของ 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; • } • }

  6. 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

  7. Programming with Multiple Classes

  8. 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”

  9. 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; } }

  10. 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; } }

  11. 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."); } }

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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”

  18. Inheritance

  19. Inheritance • การรับถ่ายทอดคุณสมบัติ (Inheritance) • หมายถึง การที่คลาสหนึ่งๆ รับถ่ายคุณสมบัติ (inherit) ทั้งค่าคุณลักษณะ (Attribute) และพฤติกรรม (Method) มาจากอีกคลาสหนึ่ง • แต่ไม่รวมถึง คอนสตรัคเตอร์ (Constructor)

  20. รับถ่ายทอดคุณสมบัติ (inherit) Inheritance Class Diagram of “BankAccount” class and “SavingsAccount” class

  21. public class Employee { public String name; public double salary; public MyDate birthDate; public String getDetails( ) { … } } Subclassing • พิจารณาคลาส Employee • เราสามารถสร้างวัตถุที่มีคลาสเป็นพนักงาน ได้โดยการกำหนดคลาส “Employee” • ถ้าเราต้องการสร้างคลาสของ “Manager” ที่ยังคงคุณสมบัติเป็น “Employee” คนหนึ่ง แต่มีคุณสมบัติบางอย่างเพิ่มเติม

  22. public class Manager { public String name; public double salary; public MyDate birthDate; public String department; public String getDetails( ) { … } } Subclassing • พิจารณาคลาส Manager • โครงสร้างคลาส “Manager” กับ “Employee” ซ้ำซ้อนกัน • เราใช้วิธีการเชิงวัตถุสร้างคลาสใหม่ จากคลาสเดิมที่มีอยู่แล้ว วิธีการนี้เราเรียกว่า “Subclassing”

  23. Subclassing • UML Diagram • การสร้างคลาสใหม่จากคลาสเดิมที่มีอยู่แล้ว สนับสนุนแนวคิด ของการนำ Source Code กลับมาใช้ใหม่

  24. Inheritance • การรับถ่ายทอดคุณสมบัติ (Inheritance) • หมายถึง การที่คลาสหนึ่งๆ รับถ่ายคุณสมบัติ (inherit) ทั้งค่าคุณลักษณะ (Attribute) และพฤติกรรม (Method) มาจากอีกคลาสหนึ่ง • แต่ไม่รวมถึง คอนสตรัคเตอร์ (Cosntructor) • คือการที่ class ที่ต่างกันมี Attributes และ Methods ที่เหมือนกัน

  25. Single Inheritance • Single Inheritance • หมายถึง การที่คลาสหนึ่งๆ รับถ่ายทอดคุณสมบัติ (inherit) ทั้ง Attribute และ Method มาจากอีกคลาสหนึ่ง • เราเรียกว่าคลาส “Manager” รับถ่ายทอดคุณสมบัติ (inherit) มาจาก คลาส “Employee”

  26. Multiple Inheritance • Multiple Inheritance • หมายถึง การที่คลาสหนึ่งๆ รับถ่ายทอดคุณสมบัติ (inherit) ทั้งค่าคุณลักษณะ และพฤติกรรมมาจากคลาสมากกว่า 1 คลาส • ภาษาจาวา • ไม่สนับสนุนการทำ Multiple Inheritance • แต่สามารถรับสืบทอดคุณสมบัติจากหลายคลาสได้โดยใช้ “Interface”

  27. 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; }

  28. Defining Extending Class in Java • การกำหนดคลาสที่รับคุณสมบัติสืบทอดในภาษาจาวา สามารถทำได้ดังนี้ <modifier> class child-class extends parent-class { : } • ตัวอย่าง public class Manager extends Employee { publicString department; }

  29. “super” and “this” keyword • “this” keyword • ใช้อ้างอิงถึงคลาสปัจจุบัน • สามารถใช้อ้างอิงถึง Attribute หรือ Method ของคลาสปัจจุบัน ได้โดยใส่ . แล้วตามด้วยชื่อ Attribute หรือ ชื่อ Method • “super” keyword • ใช้อ้างอิงถึง superclass ของคลาสปัจจุบัน • super( ) อ้างอิงถึง constructor ของ superclass • super.method( ) อ้างอิงถึง method ของ superclass

  30. 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(); } }

  31. 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(); } }

  32. Overriding Methods • subclass/child class สามารถเปลี่ยนแปลงพฤติกรรม ที่รับถ่ายทอด (inherit) มาจาก superclass/parent class ได้ • subclass สามารถกำหนด Method ที่มีหน้าที่/พฤติกรรม ต่างจาก Method ของ superclass ได้แต่ต้องมีสิ่งต่อไปนี้ที่เหมือนกัน • Method Name • Return Type • Argument list

  33. 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(); } }

  34. 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; } }

  35. 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; } }

  36. 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; } }

  37. 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”

  38. 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

  39. Access Control • การควบคุมการเข้าถึงข้อมูล (Access Control) • คือ วิธีการเชิงวัตถุ ที่ภาษาจาวามีไว้เพื่อ ใช้เขียนโปรแกรมสนับสนุนคุณสมบัติ Encapsulation และ Information Hiding • การระบุค่า Access Control Specifier เป็นการควบคุมการเข้าถึงข้อมูล โดยจะใช้ระบุก่อนหน้า ตัวแปร ค่าคงที่เมทธอด และคลาส • ค่า Access Control Specifier ได้แก่ • public- เปิดให้เข้าถึงข้อมูลได้จากทุกๆที่ • private- เปิดให้เข้าถึงข้อมูลได้ภายในขอบเขตที่กำหนด • protected- เปิดให้เข้าถึงข้อมูลได้จากการสืบทอดคุณสมบัติ

  40. 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; • } • }

  41. Inheritance & Access Control • พิจารณา • การระบุค่าการเข้าถึงข้อมูล (Access Control) ให้เป็น public ทำให้คลาสอื่นๆ ทุกคลาส สามารถเข้าถึง Attributes ของคลาส Employee ได้ • ถ้าต้องการให้เฉพาะคลาส Manager สามารถเข้าถึง Attributes ของ Employee จะทำอย่างไร?

  42. protected Inheritance & Access Control • พิจารณา • สามารถกำหนดเข้าถึงข้อมูล (Access Control) ให้สามารถเข้าถึงได้ผ่านทางการสืบทอดคุณสมบัติเท่านั้น • ทำได้โดยระบุค่า Access Control Specifierเป็น protected

  43. 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); } }

  44. “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+")"; } }

  45. “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; } }

  46. “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; } }

  47. “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()); }

  48. Inheritance Relationships of Point, Circle and Cylinder

  49. 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

  50. Specialization • Subclass/Child Class รับถ่ายทอดคุณสมบัติ (inherit) ทั้ง Attributes และ Methods มาจาก Superclass/Parent Class Employee Manager

More Related