Loading...

Жалпылоо жана мурастоо

 

Жалпы класстар мурас иерархиясына катыша алат: алар башкалардан тукум кууп өтүшү мүмкүн, же алар базалык класстар катары иштей алат. Келгиле, ар кандай жагдайларды карап көрөлү.

 

Негизги жалпы класс

Жалпы класстан мурастоодо, туунду класс типтеги маалыматтарды базалык класстын конструкцияларында өткөрүп бериши керек:

class Account<T>

{

    private T _id;

    T getId(){return _id;}

    Account(T id)

    {

        _id = id;

    }

}

 

class DepositAccount<T> extends Account<T>{

 

    DepositAccount(T id){

        super(id);

    }

}

DepositAccount конструкторунда типтеги маалыматтар берилүүчү базалык класстын конструкторуна чакыруу бар.

 

Классты колдонуу учурлары:

DepositAccount dAccount1 = new DepositAccount(20);

System.out.println(dAccount1.getId());

        

DepositAccount dAccount2 = new DepositAccount("12345");

System.out.println(dAccount2.getId());

Ошол эле учурда, алынган класс өзүнүн кээ бир типтеги параметрлерин кошуп жана колдоно алат:

class Account<T>

{

    private T _id;

    T getId(){return _id;}

    Account(T id)

    {

        _id = id;

    }

}

 

class DepositAccount<T, S> extends Account<T>{

 

    private S _name;

    S getName(){return _name;}

    DepositAccount(T id, S name){

        super(id);

        this._name=name;

    }

}

Колдонуу учурлары:

DepositAccount<Integer, String> dAccount1 = new DepositAccount(20, "Tom");

System.out.println(dAccount1.getId() + " : " + dAccount1.getName());

        

DepositAccount<String, Integer> dAccount2 = new DepositAccount("12345", 23456);

System.out.println(dAccount2.getId() + " : " + dAccount2.getName());

Жана дагы бир жагдай - мураскор классы такыр жалпыланбашы мүмкүн:

class Account<T>

{

    private T _id;

    T getId(){return _id;}

    Account(T id)

    {

        _id = id;

    }

}

 

class DepositAccount extends Account<Integer>{

 

    DepositAccount(){

        super(5);

    }

}

Бул жерде, мурастоодо, базалык класстын конструкциялары тарабынан колдонула турган тип ачык көрсөтүлөт, башкача айтканда, Integer түрү. Андан кийин, бул типтеги маани базалык класстын конструкторуна берилет - бул учурда 5 саны.

 

Колдонуу жагдайы:

DepositAccount dAccount1 = new DepositAccount();

System.out.println(dAccount1.getId());

Жалпы туунду класс

Негизги класс кадимки эмес класс болгон жагдай да болушу мүмкүн. Мисалы:

class Account

{

    private String _name;

    String getName(){return _name;}

    Account(String name)

    {

        _name=name;

    }

}

 

class DepositAccount<T> extends Account{

 

    private T _id;

    T getId(){return _id;}

    DepositAccount(String name, T id){

        super(name);

        _id = id;

    }

}

Бул учурда, балада базалык класс конструкцияларын колдонуу адаттагыдай эле жүрөт.

 

Жалпы типти конверсиялоо

Бир жалпы типтеги объект, эгерде алар ошол эле типти колдонсо, башка түргө чыгарылышы мүмкүн. Мисал катары төмөнкү эки жалпы классты колдонуу менен типти өзгөртүүнү карап көрөлү:

class Account<T>

{

    private T _id;

    T getId(){return _id;}

    Account(T id)

    {

        _id = id;

    }

}

 

class DepositAccount<T> extends Account<T>{

 

    DepositAccount(T id){

        super(id);

    }

}

Биз DepositAccount<Integer> аккаунтун<Integer> же DepositAccount<String> аккаунтун<String> чыгара алабыз:

DepositAccount<Integer> depAccount = new DepositAccount(10);

Account<Integer> account = (Account<Integer>)depAccount;

System.out.println(account.getId());

Бирок биз гетерогендик объектилер менен ушундай кыла албайбыз. Мисалы, төмөнкү код иштебейт:

DepositAccount<Integer> depAccount = new DepositAccount(10);

Account<String> account = (Account<String>)depAccount;