Download presentation
Presentation is loading. Please wait.
Published byRoland Norton Modified over 9 years ago
1
بسم الله الرحمن الرحیم برنامه سازی پیشرفته ( جاوا ) مدرس : محمد غمگسار ghamgosarmohammad@gmail.com
2
بخش 4: ترکیب و وراثت
3
مقدمه برخی اوقات این نیاز وجود دارد که برای تعریف یک کلاس جدید از کلاسهای موجود استفاده میشود این کار به دو روش انجام میشود: ترکیب وراثت برنامه نویسی پیشرفته ( جاوا )3
4
ترکیب ترکیب کلاسها به معنای استفاده از یک یا چند کلاس در داخل تعریف کلاس دیگر، اطلاق می شود هنگامی که عضو داده ای از کلاس جدید ،شی از کلاس دیگر باشد ،میگوییم که کلاس جدید ترکیبی از سایر اشیا است برنامه نویسی پیشرفته ( جاوا )4
5
UML نمودار کلاس نقطه موجود است خط تشکیل شده از دو نفطه برنامه نویسی پیشرفته ( جاوا )5
6
ساختار کلاس Line class Line{ private point begin; poin end; public Line(int x1,int y1,int x2,int y2){….} public Line(point begin,point end){….}. public String toString(){….} public double getLength(){…} } برنامه نویسی پیشرفته ( جاوا )6
7
public Line(int x1,int y1,int x2,int y2){ begin = new Point(x1, y1); end = new Point(x2, y2); } public Line(Point begin, Point end) { this.begin = begin; this.end = end; } public Line(int x1,int y1,int x2,int y2){ begin = new Point(x1, y1); end = new Point(x2, y2); } public Line(Point begin, Point end) { this.begin = begin; this.end = end; } سازنده های کلاس Line public class TestLine { public static void main(String[] args) { Line l1 = new Line (0, 3, 4, 0); point p1 = new point (3, 0); point p2 = new point (0, 4); Line l2 = new Line (p1, p2); } public class TestLine { public static void main(String[] args) { Line l1 = new Line (0, 3, 4, 0); point p1 = new point (3, 0); point p2 = new point (0, 4); Line l2 = new Line (p1, p2); } تابع main برنامه نویسی پیشرفته ( جاوا )7
8
پیاده سازی کلاس Line برنامه نویسی پیشرفته ( جاوا )8
9
وراثت استفاده مجدد از نرم افزارهای موجود برای خلق یک نرم افزار جدید ،وراثت نامیده میشود. وراثت همچنین خصوصی سازی یا اشتقاق نامیده میشود. برنامه نویسی پیشرفته ( جاوا )9
10
class نام کلاس مشتق شده extends کلاس پایه {. } نشاندهنده ارث بری عمومی است، یعنی اعضای عمومی کلاس پایه، اعضای عمومی کلاس مشتق شده نیز می باشند نشاندهنده ارث بری عمومی است، یعنی اعضای عمومی کلاس پایه، اعضای عمومی کلاس مشتق شده نیز می باشند وراثت برنامه نویسی پیشرفته ( جاوا )10
11
UML نمودار کلاس دایره موجود است سطح مقطع استوانه، دایره می باشد. کلاس پایه زیرکلاس یا کلاس مشتق شده برنامه نویسی پیشرفته ( جاوا )11
12
class circle{ private double radius; public circle(){radius=1.0;} public circle(double radius){this.radius=radius;} public float getRadius(){return radius;} public float getArea(){return3.14*radius*radius; } class circle{ private double radius; public circle(){radius=1.0;} public circle(double radius){this.radius=radius;} public float getRadius(){return radius;} public float getArea(){return3.14*radius*radius; } کلاس دایره برنامه نویسی پیشرفته ( جاوا )12
13
class cylinder extends circle{ private double height; public cylider(){…..} public cylider(double rsdius,double height ){…..}. } class cylinder extends circle{ private double height; public cylider(){…..} public cylider(double rsdius,double height ){…..}. } ساختار کلاس استوانه برنامه نویسی پیشرفته ( جاوا )13
14
سازنده های کلاس استوانه public cylinder(){ super(); height=1.0; } public cylinder(double radius,double height){ super(radius ); this.height=height; } public cylinder(){ super(); height=1.0; } public cylinder(double radius,double height){ super(radius ); this.height=height; } public class CylinderTest{ public static void main(String[] args) { cylinder cy1 = new cylinder(); cylinder cy2 = new cylinder(5.0, 2.0); } public class CylinderTest{ public static void main(String[] args) { cylinder cy1 = new cylinder(); cylinder cy2 = new cylinder(5.0, 2.0); } تابع main هر سازنده ،پیش از اجرا،سازنده والد خود را فراخوانی می کند. برنامه نویسی پیشرفته ( جاوا )14
15
متدهای کلاس استوانه public double getVolume() { return getArea()*height; } } public double getVolume() { return getArea()*height; } } public class CylinderTest{ public static void main(String[] args) { cylinder cy1 = new cylinder(); c1.getArea(); c1.getVloume(); cylinder cy2 = new cylinder(5.0, 2.0); c2.getArea(); c2.getVloume(); } public class CylinderTest{ public static void main(String[] args) { cylinder cy1 = new cylinder(); c1.getArea(); c1.getVloume(); cylinder cy2 = new cylinder(5.0, 2.0); c2.getArea(); c2.getVloume(); } تابع main برنامه نویسی پیشرفته ( جاوا )15
16
پیاده سازی کلاس استوانه برنامه نویسی پیشرفته ( جاوا )16
17
لغو کردن و تسلط داشتن بر اعضا موروثی در برخی از موارد ممکن است نیاز به تعریف یک نسخه محلی عضوموروثی باشد. مثلا اگر a عضو داده ای از X و Y زیر کلاسی از X باشد انگاه امکان تعریف عضوداده ای مجزا برای Y به نام a وجوددارد a تعریف شده در Y بر a تعریف شده در X تسلط دارد قانون مشابهی در مورد توابع عضو اجرا می شود تابع محلی تعریف شده در Y تابع هم نام خوددر X را لغو میکند برنامه نویسی پیشرفته ( جاوا )17
18
class X{ public int a; public void f(){ System.out.println("X::f"); } class y extends X{ public int a; public void f(){ System.out.println("y::f"); } class X{ public int a; public void f(){ System.out.println("X::f"); } class y extends X{ public int a; public void f(){ System.out.println("y::f"); } class Main{ public static void main(String args[]){ X x=new X(); x.f(); x.a=22; y x1=new y(); x1.a=44; x1.f(); } class Main{ public static void main(String args[]){ X x=new X(); x.f(); x.a=22; y x1=new y(); x1.a=44; x1.f(); } نسخه محلی f اولویت دارد برنامه نویسی پیشرفته ( جاوا )18
19
run: X::f y::f BUILD SUCCESSFUL (total time: 0 seconds) برنامه نویسی پیشرفته ( جاوا )19
20
لغو کردن یا Override می خواهیم تابعی به نام getArea برای محاسبه مساحت جانبی به کلاس استوانه اضافه کنیم می خواهیم تابعی به نام getArea برای محاسبه مساحت جانبی به کلاس استوانه اضافه کنیم مشکل دو تابع با نام getArea در کلاس پایه وکلاس مشتق شده داریم مشکل دو تابع با نام getArea در کلاس پایه وکلاس مشتق شده داریم برنامه نویسی پیشرفته ( جاوا )20
21
متد getArea کلاس استوانه @Override public double getArea(){ return 2*Math.PI*getRadius()*height +2*super.getArea(); } @Override public double getArea(){ return 2*Math.PI*getRadius()*height +2*super.getArea(); } نسخه کلاس پایه برنامه نویسی پیشرفته ( جاوا )21
22
UML نمودار تابع toString در هردو کلاس مشترک است برنامه نویسی پیشرفته ( جاوا )22
23
public class Point3D extends Point { private int z; public Point3D() { super(); z = 0; } public Point3D(int x, int y, int z) { super(x, y); this.z = z; } public int getZ() { return z; } public void setZ(int z) { this.z = z; } @Override public String toString() { return "(" + super.getX() + "," + super.getY() + "," + z + ")"; } public class Point3D extends Point { private int z; public Point3D() { super(); z = 0; } public Point3D(int x, int y, int z) { super(x, y); this.z = z; } public int getZ() { return z; } public void setZ(int z) { this.z = z; } @Override public String toString() { return "(" + super.getX() + "," + super.getY() + "," + z + ")"; } سازنده بدون پارامتر کلاس پایه سازنده با پارامترکلاس پایه سربارگذاری پیاده سازی کلاس Point3D برنامه نویسی پیشرفته ( جاوا )23
24
اعضا protected دستیابی protected حالت تعادل بین private و public است اعضا protected از طریق خود کلاس ،کلاسهای داخل package کلاس و کلاسهای مشتق شده از آن قابل دستیابی هستند یک زیر کلاس تمام اعضای protected و public کلاس پایه خودرابه ارث میبرد. از دیدگاه یک زیر کلاس اعضای عمومی و محافظت شده کلاس پایه،واقعا در زیرکلاس تعریف شده اند ونیازی به ذکر مجدد انها نیست برنامه نویسی پیشرفته ( جاوا )24
25
اعضا protected در چه مواقعی یک عضو به عنوان محافظت شده و درچه مواردی به صورت خصوصی تعریف میشود؟ قلب پنهان سازی اطلاعات محدودسازی دستیابی در حال ،برای آسان سازی تغییرات در آینده قلب پنهان سازی اطلاعات محدودسازی دستیابی در حال ،برای آسان سازی تغییرات در آینده هر تغییری در اعضای محافظت شده کلاس پایه ممکن است نیاز به اصلاح همه ی کلاسهای مشتق شده داشته باشد برنامه نویسی پیشرفته ( جاوا )25
26
class vehicle{ protected int wheel,passen; public void set_wheel(int n){wheel=n; } public int get_wheel(){return wheel;} public void set_pass(int n){passen=n; } int get_pass(){return passen;} } class truck extends vehicle{ int cargo; public void set_cargo(int s){cargo=s; } public int get_cargo(){ return cargo;} public void show(){ System.out.println(wheel+" "+passen+" "+cargo); } class vehicle{ protected int wheel,passen; public void set_wheel(int n){wheel=n; } public int get_wheel(){return wheel;} public void set_pass(int n){passen=n; } int get_pass(){return passen;} } class truck extends vehicle{ int cargo; public void set_cargo(int s){cargo=s; } public int get_cargo(){ return cargo;} public void show(){ System.out.println(wheel+" "+passen+" "+cargo); } public class Main { public static void main(String[] args) { truck t=new truck(); t.set_wheel(18); t.set_pass(2); t.set_cargo(3200); t.show(); } public class Main { public static void main(String[] args) { truck t=new truck(); t.set_wheel(18); t.set_pass(2); t.set_cargo(3200); t.show(); } برنامه نویسی پیشرفته ( جاوا )26
27
چندریختی یکی از قدرتمند ترین ویژگیهای شی گرایی ،این است که به اشیا متفاوت اجازه می دهد در برابر فراخوانی تابع واکنشهای متفاوتی بروز دهند چند شکلی از این واقعیت ناشی می شود که شی از کلاس پایه ، میتواند به عنوان شی از کلاس مشتق شده استفاده شود. circle c1 = new cylinder(); circle c1 = new cylinder(5.0); cylinder aCylinder = (cylinder); circle c1 = new cylinder(); circle c1 = new cylinder(5.0); cylinder aCylinder = (cylinder); برنامه نویسی پیشرفته ( جاوا )27
28
چندریختی از طریق توابع مجازی تابع مجازی ،تابعی است که هیچ پیاده سازی برای آن در کلاس پایه وجود ندارد. کلاس پایه مجرد، کلاسی است که یک یا چند تابع عضو آن مجازی باشد. برنامه نویسی پیشرفته ( جاوا )28
29
abstract public class Shape { private String color; public Shape (String color) { this.color = color; } @Override public String toString() { return "Shape of color=\"" + color + "\""; } abstract public double getArea(); } abstract public class Shape { private String color; public Shape (String color) { this.color = color; } @Override public String toString() { return "Shape of color=\"" + color + "\""; } abstract public double getArea(); } پیاده سازی کلاس Shape کلاس پایه مجازی تابع مجازی برنامه نویسی پیشرفته ( جاوا )29
30
public class Triangle extends Shape { private int base; private int height; public Triangle(String color, int base, int height) { super(color); this.base = base; this.height = height; } @Override public String toString() { return "Triangle of base=" + base + " and height=" + height + ", subclass of " + super.toString(); } @Override public double getArea() { return 0.5*base*height; } } public class Triangle extends Shape { private int base; private int height; public Triangle(String color, int base, int height) { super(color); this.base = base; this.height = height; } @Override public String toString() { return "Triangle of base=" + base + " and height=" + height + ", subclass of " + super.toString(); } @Override public double getArea() { return 0.5*base*height; } } پیاده سازی کلاس مثلث برنامه نویسی پیشرفته ( جاوا )30
31
public class Rectangle extends Shape { private int length; private int width; public Rectangle (String color, int length, int width) { super(color); this.length = length; this. width = width; } @Override public String toString() { return "Rectangle of length=" + length + " and width=" + width + ", subclass of " + super.toString (); } @Override public double getArea() { return length*width; } } public class Rectangle extends Shape { private int length; private int width; public Rectangle (String color, int length, int width) { super(color); this.length = length; this. width = width; } @Override public String toString() { return "Rectangle of length=" + length + " and width=" + width + ", subclass of " + super.toString (); } @Override public double getArea() { return length*width; } } پیاده سازی کلاس مستطیل برنامه نویسی پیشرفته ( جاوا )31
32
public class TestShape { public static void main(String[] args) { Shape s1 = new Rectangle("red", 4, 5); System.out.println(s1); System.out.println("Area is " + s1.getArea()); Shape s2 = new Triangle("blue", 4, 5); System.out.println(s2); System.out.println("Area is " + s2.getArea()); } public class TestShape { public static void main(String[] args) { Shape s1 = new Rectangle("red", 4, 5); System.out.println(s1); System.out.println("Area is " + s1.getArea()); Shape s2 = new Triangle("blue", 4, 5); System.out.println(s2); System.out.println("Area is " + s2.getArea()); } چند شکلی از این واقعیت ناشی می شود که شی از کلاس پایه ، میتواند به عنوان شی از کلاس مشتق شده استفاده شود. تابع main برنامه نویسی پیشرفته ( جاوا )32
33
مقید سازی پویا وایستا Shape s1 = new Rectangle("red", 4, 5); cylinder cy1 = new cylinder(); Dynamic binding Static binding برنامه نویسی پیشرفته ( جاوا )33
34
رابط یا interface کلاسی که تمام متدهای آن مجازی باشد ارث بری چند گانه public interface } نام رابط..} public interface } نام رابط..} class A extends B implemnts c{..} class A extends B implemnts c{..} برنامه نویسی پیشرفته ( جاوا )34
35
رابط Runnable این واسط متدی به نام run دارد که رفتار شی موقع اجرا شدن را توصیف می کند GUI event- listener interfaces کاربرد این واسط مدیریت کلیک روی دکمه ها مدیریت ماوس وبه طور کلی مدیریت رویدادها در GUI ها است. برخی از واسط های مهم : ActionListener ItemListener MousListener در جاوا واسط های پیش فرض وجود دارد رابط یا interface برنامه نویسی پیشرفته ( جاوا )35
36
توابع مجازی UML نمودار implements برنامه نویسی پیشرفته ( جاوا )36
37
رابط Moveable public interface Movable { public void moveUp(); public void moveDown(); public void moveLeft(); public void moveRight(); } public interface Movable { public void moveUp(); public void moveDown(); public void moveLeft(); public void moveRight(); } برنامه نویسی پیشرفته ( جاوا )37
38
کلاس MoveablePoint public class MovablePoint implements Movable { private int x, y; public MovablePoint(int x, int y) { this.x = x; this.y = y; } @Override public String toString() { return "Point at (" + x + "," + y + ")"; } @Override public void moveUp() { y--; } @Override public void moveDown() { y++; } @Override public void moveLeft() { x--; } @Override public void moveRight() { x++; } } برنامه نویسی پیشرفته ( جاوا )38
39
public class TestMovable { public static void main(String[] args) { Movable m1 = new MovablePoint(5, 5); System.out.println(m1); m1.moveDown(); System.out.println(m1); m1.moveRight(); System.out.println(m1); } } public class TestMovable { public static void main(String[] args) { Movable m1 = new MovablePoint(5, 5); System.out.println(m1); m1.moveDown(); System.out.println(m1); m1.moveRight(); System.out.println(m1); } } تابع main برنامه نویسی پیشرفته ( جاوا )39
40
class X{ public X(){System.out.println("x::constructor") ; } class y extends X{ public y(){ System.out.println("y::constructor") ;} } class z extends y{ public z(int n){ System.out.println("z::constructor") ;} } class Main{ public static void main(String args[]){ z a=new z(7); } class X{ public X(){System.out.println("x::constructor") ; } class y extends X{ public y(){ System.out.println("y::constructor") ;} } class z extends y{ public z(int n){ System.out.println("z::constructor") ;} } class Main{ public static void main(String args[]){ z a=new z(7); } هر سازنده پیش از اجرا ،سازنده پدر خودرافراخوانی می کند خود آزمایی برنامه نویسی پیشرفته ( جاوا )40
41
run: x::constructor y::constructor z::constructor خروجی برنامه نویسی پیشرفته ( جاوا )41
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.