التعددية polymorphisem

هذا المفهموم متفرع عن مفهوم الوراثة
فهو يعتمد بشكل أساسي على أن أي كائن من الفئة الابن subclass
فإنه يمكن أن نعتبره بطريقة غير مباشرة كائن من الفئة الأب superclass
لنقل لدينا فئة اسمها كلب وفئة أخرى اسمها حيوان الفئة كلب ترث الفئة حيوان
لو كان لدينا كائن من الفئة كلب اسمه الكلب لولو فإننا سنستنتج بطريقة غير مباشرة أن الكلب لولو هو حيوان
وعلى هذا فإننا يمكن أن نضع كائن من الفئة الابن في مؤشر من الفئة الأب

SuoerClass superClassReference=new SubClassObject();

ستسألوني ما الفائدة من هذا الكلام الكثير
سأجيبكم بمثال وأخبروني ما رأيكم
في اللغة الإنجليزية الجملة تحتوي على مجموعة كلمات
الكلمة عبارة عن اسم أو فعل أو صفة أو حال أو حرف
نريد عندما نكتب جملة ونطبعها نحصل على كل نوع من الكلمات بلون مختلف عن الآخرين
الفئة الأصلية في مثالنا هي كلمة Word
الفئات التي ترث من هذه الفئة هي
اسم Noun ، فعل Verb ، صفة Adjective ، حال Adverb ، حرف Pronounce
لدينا فئة اسمها جملة Statement
هذه الفئة تحتوي على مجموعة من الكلمات
تلاحظوا أنا أقول مجموعة من الكلمات وليس من الأفعال او الأسماء أو الصفات
تصوروا معي لو أن التعددية polymorphisem غير موجود في البرمجة الكائنية
ستضطر إلى عمل تركيب بيانات Data Strucure معقد جداً لاحتواء الموضوع
بينما مع وجود التعددية فأنت تحتاج إلى مصفوفة من الكلمات لا أكثر ولا أقل
ما رأيكم أن نقوم بهذا البرنامج
(ههههههههههه أصبحت قدراتك البرمجية لا بأس بها)
احم احم ما مقصدك يا أخ عبده
على كل الشتيمة بتلف بتلف وبترجع لصاحبها
طااااااااااااخ
آي يا عبده آلمتني يا أخي لم أقصدك أنا إنما كنت أتكلم عن سالي
(اها حسبتك تقصدني على كل لا يضرك بعض التسلية 🙂 )
صحيح صحيح التسلية مهمة للصحة
ولو أني لا أرتاح إلى التسلية التي تأتي بها يا أخ عبده
الفئة كلمة

package Statment;

import java.awt.Color;

public abstract class Word {
	private String word;
	
	public Word(String word) {
		this.word=word;
	}
	
	public String getWord() {
		return word;
	}
	
	public abstract Color getColor();
}

الفئة اسم

package Statment;

import java.awt.Color;

public class Noun extends Word {

	public Noun(String word) {
		super(word);
	}

	@Override
	public Color getColor() {
		return Color.GREEN;
	}

}

الفئة فعل

package Statment;

import java.awt.Color;

public class Verb extends Word {

	public Verb(String word) {
		super(word);
	}

	@Override
	public Color getColor() {
		return Color.RED;
	}

}

الفئة صفة

package Statment;

import java.awt.Color;

public class Adjective extends Word {

	public Adjective(String word) {
		super(word);
	}

	@Override
	public Color getColor() {
		return Color.BLACK;
	}

}

الفئة حال

package Statment;

import java.awt.Color;

public class Adverb extends Word {

	public Adverb(String word) {
		super(word);
	}

	@Override
	public Color getColor() {
		return Color.ORANGE;
	}

}

الفئة حرف

package Statment;

import java.awt.Color;

public class Pronounce extends Word {

	public Pronounce(String word) {
		super(word);
	}

	@Override
	public Color getColor() {
		return Color.BLUE;
	}

}

الفئة جملة

package Statment;

import java.util.Arrays;
import java.util.Iterator;

public class Statment implements Iterable{

	private Word[] words;
	private int index;

	public Statment() {
		words = new Word[10];
		index = 0;
	}

	public Statment(Word[] words) {
		index = 0;
		Word[] tempWord = new Word[words.length];
		for (int i = 0; i < tempWord.length; i++) {
			if (words[i] != null) {
				tempWord[index] = words[i];
				index++;
			}
		}
		this.words = words;
	}

	public void addWord(Word word) {
		if(word==null)return;
		if (index == words.length) {
			int newLength = index * 2;
			words = Arrays.copyOf(words, newLength);
		}
		words[index] = word;
		index++;
	}

	public Iterator iterator() {
		return new Iterator() {
			int index=0;
			public boolean hasNext() {
				return index

الفئة عارض الكلمات

package Statment;

import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

public class TextViewer extends JFrame {
	private JTextPane textPane=new JTextPane();
	private Statment statment;
	
	public TextViewer(Statment statment) {
		super("Text Viewer");
		this.statment=statment;
		setSize(200,200);
		add(textPane);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		textPane.setText("");
		StyledDocument document=textPane.getStyledDocument();
		Style style = document.addStyle("StyleName", null);
		for (Word word : statment) {
		        
		        StyleConstants.setForeground(style, word.getColor());
		        try {
					document.insertString(document.getLength(), word.getWord()+" ", style);
				} catch (BadLocationException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}


		}
	}
	
	public static void main(String[] args) {
		Word[] words=new Word[]{new Noun("Mohamed"),new Verb("play"),new Pronounce("in"),new Pronounce("the"),new Noun("kitchen")};
		Statment statment=new Statment(words);
		TextViewer viewer=new TextViewer(statment);
		statment.addWord(new Noun("yesterday"));
	}

}

كما لحظتم أنا لم أجد أي صعوبة في عملية تخزين الكلمات بأنواعها المختلفة
إن لم يكن الموضوع متضحاً لكم فلنقل أني قمت بثلاث خطوات لتخزين الكلمات
1- قمت بإنشاء مصفوفة من النوع Word
2- قمت بإنشاء كائنات من الأنواع اسم Noun ، فعل Verb ، صفة Adjective ، حال Adverb ، حرف Pronounce
3- خزنت هذه الكائنات في المصفوفة الموجودة في 1

التعددية مفيدة جداً في حل الكثير من المشاكل
من تعمق أو يريد التعمق في تصميم الأنماط design pattern
سيجد أن التعددية تحل الكثير من المشاكل الشائعة
أبسط أنواع الأنماط التي تستخدم التعددية نمط المصنع
على كل الموضوع متسع ومشعب ولن أخوض الكثير فيه

بقي علي أن أتكلم عن نقطة أخيرة ألا وهي
ما الذي سيحصل لو أردت أن أعرف هذا الكائن من أي فئة فعلاً
بمعنى آخر من هي الفئة الأخيرة في تسلسل هذا الكائن
لأشرح الموضوع بمثال
قلنا نريد أن نستخدم مفهوم التعددية على كائن من الفئة كلب والتي ترث بدورها الفئة حيوان
يفترض بنا أن نقول
الحيوان لولو = كلب جديد("لولو")

Animation lolo=new Dog("lolo");

بعد فترة من إنشاء هذا الكائن أريد أن أعرف الكائن منشأ من أي فئة بالضبط
أقصد في مثالنا هذا أريد أن أعرف الفئة التي تم استخدام صانع كائناتها في صناعة هذا الكائن
ما الحل؟؟
يجب أن يكون هناك طريقة لحل هذه المشكلة
على كل جافا أراحتنا من التفكير والتعب
فوفرت لنا الكلمة instanceof
وهي عبارة عن كلمة محجوزة keyword
أما عن آلية الاستخدام فهي
الكائن يتبع_لـ الفئة
object instanceof Class
واضح لدينا أن نقوم بسؤال فالجواب بنعم أو لا
في مثالنا السابق

boolean isDog=lolo instanceof Dog;

أووووووووووف كان درساً طويلاً
الحمد لله الذي قدرني وأتممته
(صحيح الحمد لله الذي قدرك على تضييع المعلومات التي لدينا)
ما الذي تقصده يا أخ عبده
(أقصد أنني كنت أعرف بعض الأشياء عن التعددية والآن أصبحت هباءاً منثوراً)
اممممممممممممممممم
لا أدري ما الذي يمكنني فعله لك يا أخ عبده
لكني أرجو أن لا يكون الجميع مثلك
لن أسألكم عن هذا لأني لا أريد أن أحصل على إحباط إضافي
أتمنى لكم التوفيق

تحياتي

Tags: , , , , , , , , ,

5 تعليقات to “التعددية polymorphisem”

  1. يقول oscar:

    والله جدا استفادينا من هذا الدرس لان كانت عندي معلومات ناقصه شكرا لان من قرات الدرس توضحت شكرا جزيلا

  2. يقول admin:

    الحمد لله
    لو كان لديك أي استفسارات أو تعليقات أرحب بك أخي في أي وقت سواء هنا أو على إيميلي

  3. يقول علي عصفور:

    يسلم اديك على هذا الشرح المبسط والمفيد

  4. يقول admin:

    أتمنى أن يكون حاز على رضاك
    وأي استفسارات أنا جاهز

    تحياتي

    • يقول ProogDu:

      شكرا جزيلا لك ..
      لكن لدي سؤال عن نهاية الStatment class

      public void addWord(Word word) {
      if(word==null)return;
      if (index == words.length) {
      int newLength = index * 2;
      words = Arrays.copyOf(words, newLength);
      }
      words[index] = word;
      index

      ما نهايتها ؟؟

Leave a Reply