الدوال الـ abstract والـ enum

سبق وأن ذكرنا أن إضافة دوال للـ enum لا تختلف عن إضافة دوال بالكلاسات العادية.

بإستثناء الدوال الـ abstract فلها معاملة خاصة في الـ enum

للتذكير: الـ abstract method هي دالة يتم تعريفها بدون body أي بدون أقواس أو كود يتم تنفيذه.

في حال قمنا بإضافة abstract method للـ enum فإن كل ثابت يجب عليه عمل override لهذه الدالة بطريقته الخاصة.

مثال:

لو أردنا إضافة دالة إسمها fruitDescription تقوم بطباعة وصف للفاكهة، فإننا سنقوم بتعريفها على أنها abstract لأن كل فاكهة لها وصف مختلف وتحتاج لدالة مختلفة.

نقوم بتعريف دالة الـ abstract كالتالي:

	public abstract void printDescription();

 

والآن لنضيفها بداخل الـ enum


public enum Fruits {
	
	ORANGE(80,40,"acid"),APPLE(100,60,"sweet"),LEMON(20,8,"acid"),
	BANANA(120,150,"sweet");
	
	private int weight;
	private int calories;
	private String taste;
	
	
	private Fruits(int wei, int cal, String tas) {
		this.weight = wei;
		this.calories = cal;
		this.taste = tas;

	}
	
	public void printInfo() {
		System.out.println("   Fruit Info" + "\n"
							+ "Fruit name: " + this + "\n"
							+ "Fruit Weight: " + this.weight + "\n"
							+ "Fruit calories: " + this.calories + "\n"
							+ "Fruit Taste: " + this.taste);
							
	}	
	
        // the abstract method دالة الابستراكت
	public abstract void printDescription();

}

 

لاحظ أن لا زلنا بحاجة لعمل override للدالة، أو بمعنى أدق implements للـ abstract method.

يتم عمل الـ override للدالة لكل ثابت بالشكل التالي:

1- فتح قوسين معقوفة { } بعد الاقواس العادية () لكل ثابت.

2- عمل override للدالة بداخل الاقواس

3- تأكد من وجود فاصلة بين أقواس { } كل ثابت والآخر كي تفصل بينهم.

لنقم أولاً بعمل override للدالة عن الثابت ORANGE كي يتضح لك الأمر:

ORANGE(80,40,"acid"){ // بداية قوس البرتقال
		@Override
		public void printDescription() {
			System.out.println("The orange is the fruit of the citrus species Citrus "
					     + "× sinensis in the family Rutaceae");
		}
	}// نهاية قوس البرتقال

 

قمنا بعمل override للدالة الخاصة بطباعة وصف كل فاكهة، وكتبنا فيها الوصف الخاص بالبرتقال.

الآن لنجري ذات العملية مع بقية الفواكه بداخل الـ enum.


public enum Fruits {
	
	ORANGE(80,40,"acid"){ // بداية قوس البرتقال
		@Override
		public void printDescription() {
			System.out.println("The orange is the fruit of the citrus species Citrus "
					           + "× sinensis in the family Rutaceae");
		}
	}// نهاية قوس البرتقال
	,APPLE(100,60,"sweet") {
		@Override
		public void printDescription() {
			System.out.println("An apple is a sweet, edible fruit produced by an apple tree");
		}
	},LEMON(20,8,"acid") {
		@Override
		public void printDescription() {
			System.out.println("The lemon, Citrus limon, is a species of small evergreen"
					+ " tree in the flowering plant family Rutaceae");
		}
	},
	BANANA(120,150,"sweet") {
		@Override
		public void printDescription() {
			System.out.println("Bananas are a staple starch for many tropical populations."
					+ "Depending upon cultivar and ripeness");
		}
	};
	
	private int weight;
	private int calories;
	private String taste;
	
	
	private Fruits(int wei, int cal, String tas) {
		this.weight = wei;
		this.calories = cal;
		this.taste = tas;

	}
	
	public void printInfo() {
		System.out.println("   Fruit Info" + "\n"
							+ "Fruit name: " + this + "\n"
							+ "Fruit Weight: " + this.weight + "\n"
							+ "Fruit calories: " + this.calories + "\n"
							+ "Fruit Taste: " + this.taste);
							
	}	
	
	public abstract void printDescription();

}

 

لاحظ وجود الفاصلة "," بين كل ثابت والاخر للفصل بينهم.

الآن بإمكاننا إنشاء متغير من الفواكه بداخل الدالة main وإستدعاء الدالة printDescription لكل فاكهة

تذكر أنه سيتم إستدعاء الدالة printDescription بشكل مختلف لكل فاكهة نظراً لأن كل ثابت قام بعمل override للدالة:

 

public class Test{

	public static void main(String[] args) {
		
		Fruits lem = Fruits.LEMON;
		//استدعاء الدالة 
		lem.printDescription();
		
	
	}

}

 

سينتج عن الكود السابق الـ output التالي:

The lemon, Citrus limon, is a species of small evergreen tree in the flowering plant family Rutaceae

 

التعليقات (1)

غازي عجاج:

قمت بعمل override لدالة لم تكتبها فهل يصح ذلك؟ ???

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !