تاریخ انتشار: جمعه, ۲ خرداد ۱۳۹۹، ۱۰:۱۱ ق.ظ نویسنده: محمدیان
تاریخ انتشار: جمعه, ۲ خرداد ۱۳۹۹، ۰۸:۳۰ ق.ظ نویسنده: محمدیان

کلاس abstract حالتی بین کلاس های معمولی و interface است و کلاسی می باشد که غیرقطعی و ناتمام است و باید در سطح فرزندانش تکمیل شود. بنابراین نمیتوان از کلاس ناتمام نمونه برداری کرد و یک شئ ساخت. 

کلاس abstract میتواند، درون خودش خواص و متودهای معمولی داشته باشد و خودش آن را کامل کرده باشد و تعدادی هم متود داشته باشد که با برچسب abstract، وظیفه کامل کردن آن را به کلاس های فرزندش سپرده باشد.

 

تایپ اسکریپت به ما این امکان رو میده که با استفاده از کلمه کلیدی abstract یک کلاس abstract ایجاد کنیم. کلاس های abstract عمدتاً برای وراثت است که در آن کلاس های دیگر ممکن است از آن مشتق شوند.

* توجه : ما نمیتوانیم از کلاس های abstract یک نمونه ایجاد کنیم. این قابلیت را ندارند که از روی آنها آبجکت بسازیم.

* یک کلاس abstract به طور معمول شامل یک یا چند متود abstract یا اعلان های خواص است.

* کلاسی که از یک کلاس abstract، ارث بری میکند یا extend میشود. در واقع قصد گسترش کلاس را دارد و باید تمام متودها و خواص abstract را درون خودش تعریف کند.

در مثال زیر کلاس انتزاعی Person شامل یک متود اتزاعی find و همچنین یک متود معمولی display است. چون متود find یک متود انتزاعی است، پس حتماً باید در کلاس Employee که از کلاس Person مشتق شده، تعریف شود.

کلاس Employee باید تمام متودهای abstract موجود در کلاس Person را پیاده سازی کند و انجام دهد، در غیر اینصورت کامپایلر اعلام خطا میکند.

abstract class Person{
    name:string;
    constructor(name:string){
        this.name = name;        
    }
    display(){
        console.log(this.name);
    }
    abstract find(str:string):Person
}
//-------------------------------------------------
class Employee extends Person{
    empCode:number;
    constructor(name:string,code:number){
        super(name);
        this.empCode = code;
    }
    find(name:string){ // متودی که حتماً باید پیاده سازی میشد
        // مثلاً اجرای درخواست آجاکس برای دریافت کارمند از دیتابیس
        return new Employee(name,1);
    }    
}

let emp:Person = new Employee("Mokhtar",5420);
emp.display();
let emp2:Person = emp.find('Amir');
console.log(emp2.name)

خواص abstract هم دقیقاً همانند متود abstract در صورتی که در کلاس abstract موجود باشند، تعریف و پیاده سازی آنها در کلاس مشتق شده الزامی است.

تاریخ انتشار: جمعه, ۲ خرداد ۱۳۹۹، ۰۷:۵۸ ق.ظ نویسنده: محمدیان

static:

از قابلیت های ES6 است و بنابراین در تایپ اسکریپت نیز وجود دارد.

اعضای استاتیک یک کلاس با استفاده از نام کلاس و یک نقطه قابل دسترسی هستند و نیازی نیست برای دسترسی به آن از روی کلاس نمونه سازی انجام شود.

<className> . <StaticPeroperty>

اعضای استاتیک با کلمه کلیدی static تعریف میشوند.

class Circle{
    static pi:number = 3.14;
}

console.log(Circle.pi);

متودهای استاتیک:

class Circle{
    static pi:number = 3.14;
    static calculateArea(radius:number){
        return this.pi*radius*radius;
    }
}

console.log(Circle.calculateArea(5))

در متود calculateArea با کلمه کلیدی this به خاصیت pi دسترسی پیدا کردیم. میتوانستیم به جای this از نام کلاس یعنی Circle هم استفاده کنیم. استفاده از هر دو روش امکان پذیر است.

this.pi // معمولا وقتی استفاده میشود که هم متود وهم خاصیت، هر دو استاتیک هستند
Circle.pi // معمولا وقتی استفاده میشود که متود استاتیک نیست ولی خاصیت استاتیک است

نکته مهم :

نه کلاس و نه متود سازنده اش نمیتوانند استاتیک باشند.

تصور کنید یک کلاس فقط شامل خواص و متودهای استاتیک باشد، بنابراین نمیتوان از آن کلاس یک شئ ایجاد کرد چون هیچ رفتار خاصی از هیچ نوعی از خودش بروز نمیدهد. در چنین کلاسی بهتر است خواص و متودهای Helper یا کمکی تعریف کنیم که عمومی هستند و به سایر اعضای کلاس های ما وابستگی ندارند.

عموماً متودهای کمکی در یک برنامه به صورت مکرر فراخوانی شده و نیاز است که به سرعت در دسترس باشند.

 

تاریخ انتشار: جمعه, ۲ خرداد ۱۳۹۹، ۰۷:۱۱ ق.ظ نویسنده: محمدیان
تاریخ انتشار: جمعه, ۲ خرداد ۱۳۹۹، ۰۶:۳۱ ق.ظ نویسنده: محمدیان

استفاده از کلاس ها برای ایجاد اشیا

مجوزهای دسترسی به خواص و متودهای کلاس:

public : پیشفرض - هم در خود کلاس و هم در خارج کلاس قابل دسترسی و استفاده است.

protected : فقط درون کلاس جاری(خود کلاس) و فرزندان کلاس قابل دسترسی است. یعنی در کلاس های فرزند نیز میتوان با کلمه کلیدی this به خواص و متودهای protected دسترسی داشت.

private : فقط و فقط در خود کلاس قابل استفاده است و حتی فرزندان کلاس نمیتوانند به خواص و متودهای private دسترسی داشته باشند.

 

مثال کلاس :

class Person {
    name:string; // default is public accesor
    private type:string;
    protected age:number;

    constructor(name:string,public userName:string){
        this.name = name;
    }
}

const person = new Person("Mokhtar","Mohammadiyan");
console.log(person)
console.log(person.name)

نکنه مهم : پارامترهایی که در constructer تعریف میشوند هم خواص کلاس هستند که به صورت ورودی دریافت میشوند.

متودهای درون کلاس و دسترسی به یکدیگر

class Person {
    name:string; // default is public accesor
    private type:string;
    protected age:number;

    constructor(name:string,public userName:string){
        this.name = name;
        this.age = 34;
    }

    printAge():void{
        this.setType("Old Guy");
        console.log(this.age);
    }

    setType(type:string):void{
        this.type = type;
        console.log(this.type);
    }
}

const person = new Person("Mokhtar","Mohammadiyan");
person.printAge();
person.setType("Old");

اگر متود setType را به صورت private تعریف کرده بودیم، فقط در داخل کلاس قابل استفاده بود و در مثال فوق ما پیغام خطای کامپایلر مواجه میشدیم. 

تاریخ انتشار: جمعه, ۲ خرداد ۱۳۹۹، ۰۶:۲۴ ق.ظ نویسنده: محمدیان