کلاس های ابستراکت (انتزاعی) در جاوا

کلاس های ابستراکت (انتزاعی) در جاوا

بررسی کلاس های ابستراکت (انتزاعی)

کلاس هایی که به طور معمول در جاوا تعریف میکنیم معروف به کلاس های concrete هستند.

کلاس های ابستراکت رو در جاوا با کلیدواژه ی abstract قبل از کلیدواژه ی class تعریف میکنیم.

در کلاس های ابستراکت میتونیم کانستراکتور تعریف کنیم اما نمیتونیم از این کلاس ها آبجکت (نمونه) ایجاد کنیم، همینطور داخل کلاس های ابستراکت میتونیم متد های ابستراکت (بدون بدنه و کوتاه) تعریف کنیم.

ابستراکت به معنی کوتاه و خلاصه و این کلاس ها به سبب ویژگی هایی که گفته شد به ابستراکت نام گذاری شدند همینطور در فارسی به کلاس های ابستراکت، انتزاعی نیز گفته میشه اما در این وبسایت از کلمه ی ابستراکت استفاده میکنیم.

public abstract class MyAbstractClass{
...
}
                        

متد های ابستراکت (abstract)

متد ابسترکت (abstract) در جاوا به متد هایی گفته میشه که بدنه ندارن؛ این متد ها رو در کلاس های ابستراکت یا اینترفیس ها تعریف میکنیم تا بعدا با ارث بری بتونیم تو کلاس concrete کامل پیاده سازیشون کنیم.

سطح دسترسی متد های ابستراکت در جاوا باید protected یا public باشه.

public abstract class MyAbstractClass{

...

public abstract myAbstractMethod0(...);

protected abstract myAbstractMethod1(...);

...

}
                        

ویژگی کلاس های ابستراکت

  1. در کلاس های ابستراکت (انتزاعی) در جاوا میتونیم کانستراکتور تعریف کنیم اما نمیتونیم یک آبجکت از این کلاس ها ایجاد کنیم.
  2. کلاس concrete یا کلاس ابستراکت میتونه از یک کلاس ابستراکت ارث بری کنه.
  3. کلاس های ابستراکت میتونن از یک کلاس concrete ارث بری کنن.
  4. اگه یک کلاس concrete بخواد از کلاس ابسترکت ارث بری کنه باید تمام متد های ابستراکت، داخل کلاس concrete بازنویسی و پیاده‌سازی بشن.
  5. میتونیم یک کلاس ابستراکت رو بدون متد ابستراکت تعریف کنیم. معمولا این کارو زمانی که بخوایم در پروژه کلاس Base تعریف کنیم انجام میدیم.
  6. معمولا فیلد ها و متد های رایج بین ساب کلاس ها رو در کلاس ابستراکت تعریف میکنیم.
  7. با اینکه نمیتونیم از کلاس ابستراکت ابجکت (نمونه) ایجاد کنیم اما میتونیم با متغیری از نوع کلاس ابستراکت به یک آبجکت از نوع ساب کلاس اشاره کنیم.
  8. public class Main {
    
        public static void main(String[] args){
            MyAbstractClass c = new MyConcreteClass();
        }
    }
    
    abstract class MyAbstractClass{
    }
    
    class MyConcreteClass extends MyAbstractClass{
    }
            

مورد مطالعه

میتونیم در مورد مطالعه ی مطلب ارث بری کلاس GeometricShape رو به صورت ابستراکت تعریف کنیم و متد های getArea و getPerimeter رو به صورت ابستراکت داخل GeometricShape تعریف کرده و در کلاس های Circle و Rectangle به طور کامل پیاده سازیشون کنیم.

public abstract class GeometricShape {

    private final Date dateCreated = new Date();
    private String color;
    private boolean filled;

    public GeometricShape(String color, boolean filled){
        this.color = color;
        this.filled = filled;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Date getDateCreated() {
        return dateCreated;
    }


    public boolean isFilled() {
        return filled;
    }

    public void setFilled(boolean filled) {
        this.filled = filled;
    }

    //تعریف متد های مساحت و محیط به صورت ابستراکت
    public abstract double getArea();
    public abstract double getPerimeter();


    @Override
    public String toString() {
        if(this instanceof Circle)
            return "Circle: created on " + getDateCreated().toString() + "\n" + " area: " + getArea() +
            " perimeter " + getPerimeter();
        else
            return "Rectangle: created on " + getDateCreated().toString() + "\n" + " area: " + getArea()
            + " perimeter: " + getPerimeter();
    }

  }

class Circle extends GeometricShape{
    private double radius;

    public Circle(double radius, String color, boolean filled){
        super(color, filled);
        this.radius = radius;
    }

    public Circle(double radius){
        this(radius, "white", false);
    }

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    //پیاده سازی کامل متد های مساحت و محیط

    @Override
    public double getArea(){
        return Math.PI * radius * radius;
    }

    @Override
    public double getPerimeter(){
        return 2 * Math.PI * radius;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Circle)
            return ((Circle) obj).radius == this.radius;

        return false;
    }

}

class Rectangle extends GeometricShape{
    private double width;
    private double height;

    public Rectangle(double width , double height, String color, boolean filled){
        super(color, filled);
        this.width = width;
        this.height = height;
    }

    public Rectangle(){
        this(1.0, 1.0, "White", true);
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    //پیاده سازی کامل متد های مساحت و محیط
    @Override
    public double getArea(){
        return width * height;
    }

    @Override
    public double getPerimeter(){
        return (width + height) * 2;
    }


    @Override
    public String toString() {
        return "Rectangle: created on " + getDateCreated().toString() + "\n" +
        "width: " + getWidth() + " height: " + getHeight() + " area: " + getArea() + " perimeter: "
        + getPerimeter();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Rectangle){
            Rectangle r = (Rectangle) obj;
            return r.width == this.width && r.height == this.height;
        }

        return false;
    }
}
                        

ایجاد نمونه از کلاس های Circle و Rectangle

public static void main(String[] args){

    GeometricShape circle = new Circle();
    System.out.println(circle.toString());

    GeometricShape rectangle = new Rectangle();
    System.out.println(rectangle.toString());

}
                        

خلاصه

  • به کلاس هایی که میتونیم متد ابستراکت داخلشون تعریف کنیم کلاس های ابستراکت میگیم.
  • برای تعریف کلاس ابستراکت از کلیدواژه ی abstract قبل از کلیدواژه ی class استفاده میکنیم.
  • متد های ابستراکت داخل کلاس های ابستراکت رو هم با کلیدواژه ی abstract تعریف میکنیم.
  • هنگامی که بخوایم یک سری متدها و ویژگی های مشترک برای ساب کلاس ها تعریف کنیم از کلاس های ابستراکت استفاده میکنیم.
  • نمیتونیم از کلاس های ابستراکت نمونه ایجاد کنیم و فقط میتونیم ازشون ارث بری کنیم.
  • اگه کلاس concrete بخواد از یک کلاس abstract ارث بری کنه باید تمام متد های ابستراکت کلاس رو پیاده‌سازی کنیم.

برای اطلاع از جدیدترین مطالب یا پرسش و پاسخ عضو کانال و گروه تلگرامی ما شوید.

arrow_drop_up
کپی شد!