JavaRush /Блоги Java /Random-TG /Мероси сершумор дар Java. Таркиб ва мерос
DSergey_Kh
Сатҳи

Мероси сершумор дар Java. Таркиб ва мерос

Дар гурӯҳ нашр шудааст

Мероси чандкарата дар Java

Мероси сершумор ба шумо имкон медиҳад, ки синферо эҷод кунед, ки аз якчанд суперклассҳо мерос мегирад. Бар хилофи баъзе дигар забонҳои барномасозии ба an object нигаронидашуда, ба монанди C++, Java ба мероси сершумор аз синфҳо иҷозат намедиҳад. Java мероси якчанд синфро дастгирӣ намекунад, зеро он метавонад ба мушкилоти алмос оварда расонад. Ва ба ҷои ҷустуҷӯи роҳҳои ҳалли ин мушкилот, имконоти беҳтаре мавҷуданд, ки чӣ тавр мо метавонем як натиҷаро ба мисли мероси сершумор ба даст орем.

Мушкилоти алмос

Барои осонтар фаҳмидани мушкилоти алмос, биёед фарз кунем, ки мероси сершумор дар Java дастгирӣ карда мешавад. Дар ин ҳолат, мо метавонем иерархияи синф дошта бошем, ки дар тасвири зер нишон дода шудааст. Мероси сершумор дар Java.  Таркиб бар зидди мерос - 1Фарз мекунем, ки синф SuperClassабстрактист ва дар он ягон метод эълон шудааст. Хам синфхои конкретй ClassAва ClassB.
package com.journaldev.inheritance;
public abstract class SuperClass {
	public abstract void doSomething();
}
package com.journaldev.inheritance;
public class ClassA extends SuperClass{
	@Override
	public void doSomething(){
		System.out.println("doSomething implementation of A");
	}
	//ClassA own method
	public void methodA(){
	}
}
package com.journaldev.inheritance;
public class ClassB extends SuperClass{
	@Override
	public void doSomething(){
		System.out.println("doSomething implementation of B");
	}
	//ClassB specific method
	public void methodB(){
	}
}
Акнун фарз кунем, ки мо мехоҳем онро амалӣ кунем ClassCва аз ClassAва мерос гирем ClassB.
package com.journaldev.inheritance;
public class ClassC extends ClassA, ClassB{
	public void test(){
		//calling super class method
		doSomething();
	}
}
Дар хотир доред, ки усул test()усули суперклассро даъват мекунад doSomething(). Ин ба номуайянӣ оварда мерасонад, зеро компилятор намедонад, ки кадом усули суперклассро иҷро кунад. Ин диаграммаи синфи алмосшакл аст, ки мушкилоти алмос номида мешавад. Ин сабаби асосии он аст, ки Java мероси сершуморро дастгирӣ намекунад. Дар хотир доред, ки мушкилоти дар боло зикршуда бо мероси синфҳои сершумор метавонад танҳо бо се синфе рух диҳад, ки ҳадди аққал як усули умумӣ доранд.

Мероси интерфейси сершумор

Дар Java, мероси сершумор дар синфҳо дастгирӣ намешавад, аммо он дар интерфейсҳо дастгирӣ карда мешавад. Ва як интерфейс метавонад бисёр интерфейсҳои дигарро васеъ кунад. Дар зер як мисоли оддӣ оварда шудааст.
package com.journaldev.inheritance;
public interface InterfaceA {
	public void doSomething();
}
package com.journaldev.inheritance;
public interface InterfaceB {
	public void doSomething();
}
Дар хотир доред, ки ҳарду интерфейс як усулро эълон мекунанд. Ҳоло мо метавонем интерфейсеро созем, ки ҳардуи ин интерфейсҳоро васеъ мекунад, тавре ки дар мисоли зер нишон дода шудааст.
package com.journaldev.inheritance;
public interface InterfaceC extends InterfaceA, InterfaceB {
	//same method is declared in InterfaceA and InterfaceB both
	public void doSomething();
}
Ин хеле хуб кор мекунад, зеро интерфейсҳо танҳо усулҳоро эълон мекунанд ва татбиқ дар синфҳое анҷом дода мешавад, ки интерфейсро мерос мегиранд. Ҳамин тариқ, ҳеҷ гуна роҳи ба даст овардани номуайянӣ дар мероси интерфейси сершумор вуҷуд надорад.
package com.journaldev.inheritance;
public class InterfacesImpl implements InterfaceA, InterfaceB, InterfaceC {
	@Override
	public void doSomething() {
		System.out.println("doSomething implementation of concrete class");
	}
	public static void main(String[] args) {
		InterfaceA objA = new InterfacesImpl();
		InterfaceB objB = new InterfacesImpl();
		InterfaceC objC = new InterfacesImpl();

		//all the method calls below are going to same concrete implementation
		objA.doSomething();
		objB.doSomething();
		objC.doSomething();
	}
}
Лутфан қайд кунед, ки ҳар вақте ки шумо ягон усули суперклассро бекор мекунед ё усули интерфейсро амалӣ мекунед, эзоҳро истифода баред @Override. Чӣ мешавад, агар мо хоҳем, ки функсияи methodA()синф ClassAва функсияи methodB()синфро ClassBдар синф истифода барем ClassC? Ҳалли он дар истифодаи таркиб аст. Дар зер versionи синф аст ClassC, ки таркибро барои муайян кардани ҳам усулҳои синф ва ҳам усули doSomething()яке аз an objectҳо истифода мебарад.
package com.journaldev.inheritance;
public class ClassC{
	ClassA objA = new ClassA();
	ClassB objB = new ClassB();
	public void test(){
		objA.doSomething();
	}
	public void methodA(){
		objA.methodA();
	}
	public void methodB(){
		objB.methodB();
	}
}

Таркиб ва мерос

Яке аз беҳтарин таҷрибаҳои барномасозии Java ин "тасдиқи таркиби пеш аз мерос" мебошад. Мо баъзе ҷанбаҳоеро, ки ба ин равиш мувофиқат мекунанд, меомӯзем.
  1. Фарз мекунем, ки мо суперкласс ва синфе дорем, ки онро васеъ мекунад:

    package com.journaldev.inheritance;
    public class ClassC{
    	public void methodC(){
    	}
    }
    package com.journaldev.inheritance;
    public class ClassD extends ClassC{
    	public int test(){
    		return 0;
    	}
    }

    Рамзи дар боло овардашуда хуб кор мекунад. Аммо, агар мо татбиқи синфро ClassCтавре ки дар зер нишон дода шудааст, тағир диҳем:

    package com.journaldev.inheritance;
    public class ClassC{
    	public void methodC(){
    	}
    	public void test(){
    	}
    }

    Аҳамият диҳед, ки усул test()аллакай дар зерсинф мавҷуд аст, аммо намуди бозгашт гуногун аст. Акнун синф ClassDтартиб намедиҳад ва агар шумо ягон IDE-ро истифода баред, он аз шумо хоҳиш мекунад, ки намуди бозгаштро дар суперкласс ё зерсинф иваз кунед.

    Акнун вазъиятеро тасаввур кунед, ки мо иерархияи мероси синфҳои бисёрсатҳӣ дорем ва ба суперкласс дастрасӣ надорем. Мо дигар илоҷ нахоҳем дошт, ба ҷуз иваз кардани имзои усули зеркласси худ ё номи он барои бартараф кардани хатои компиляция. Мо инчунин бояд усули зерсинфро дар ҳама ҷойҳое, ки онро даъват мекунанд, тағир диҳем. Ҳамин тариқ, мерос рамзи моро нозук мекунад.

    Мушкилоти дар боло зикршуда ҳеҷ гоҳ бо таркиб рух намедиҳад ва ин онро барои мерос ҷолибтар мекунад.

  2. Мушкилоти дигари мерос ин аст, ки мо ҳама усулҳои суперклассро ба муштарӣ фош мекунем ва агар суперкласси мо дуруст тарҳрезӣ нашуда бошад ва сӯрохиҳои амниятӣ вуҷуд дошта бошанд, гарчанде ки мо татбиқи беҳтарини синфи худро амалӣ мекунем, ба мо татбиқи суст таъсир мерасонад. аз суперкласс. Таркиб ба мо дар таъмини дастрасии назоратшаванда ба усулҳои суперсинф кӯмак мекунад, дар ҳоле ки мерос назоратро бар усулҳои суперсинф таъмин намекунад. Ин ҳам яке аз бартариҳои асосии таркиб аз мерос аст.

  3. Бартарии дигари таркиб дар он аст, ки он имкон медиҳад, ки усулҳои занг задан чандирӣ дошта бошанд. Татбиқи мо синфи ClassCдар боло овардашуда оптималӣ нест ва кафолат медиҳад, ки вақти тартибдиҳӣ бо усули даъватшаванда алоқаманд аст. Бо тағироти ҳадди аққал мо метавонем усули зангро чандир ва динамикӣ гардонем.

    package com.journaldev.inheritance;
    public class ClassC{
    	SuperClass obj = null;
    	public ClassC(SuperClass o){
    		this.obj = o;
    	}
    	public void test(){
    		obj.doSomething();
    	}
    	public static void main(String args[]){
    		ClassC obj1 = new ClassC(new ClassA());
    		ClassC obj2 = new ClassC(new ClassB());
    
    		obj1.test();
    		obj2.test();
    	}
    }

    Натиҷаи барномаи дар боло овардашуда:

    doSomething implementation of A
    doSomething implementation of B

    Ин чандирӣ дар даъвати методӣ бо мерос дастрас нест, ки ин ба интихоби таркиб манфиати дигар медиҳад.

  4. Санҷиши воҳидҳо бо таркиб осонтар аст, зеро мо медонем, ки мо ҳама усулҳои суперклассро истифода мебарем ва метавонем онҳоро барои санҷиш нусхабардорӣ кунем. Дар ҳоле ки дар мерос мо бештар аз суперкласс вобаста ҳастем ва на ҳама усулҳои суперсинфи истифодашавандаро намедонем. Пас, мо бояд тамоми усулҳои суперклассро санҷем, ки ин кори изофӣ аз ҳисоби мерос аст.

    Идеалӣ, мо бояд меросро танҳо вақте истифода барем, ки муносибати зерсинф ба суперсинф ҳамчун "аст" муайян карда шавад. Дар ҳама ҳолатҳои дигар, истифодаи таркиб тавсия дода мешавад.

Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION