![]()
Освен затварянето на данните и програмите в клас и наследяване на класовете, третата характеристика на обектно-ориентираното програмиране е полиморфизмът. Това е използване на един и същ програмен код за еднакви или подобни действия върху различни данни. Той се реализира при обръщение към метод от обект и в зависимост от типа на параметрите и самия обект се изпълнява един или друг програмен код.
Полиморфизъм
Съществуването на две или повече функции с еднакви имена, които извършват еднакви (подобни) действия се нарича полиморфизъм. Той е свързан с предефиниране на функцията. Предефинирането може да стане статично, в рамките на един клас (статичен полиморфизъм) или динамично, при наследяване (динамичен полиморфизъм).
Статичен полиморфизъм – да се предефинира (статично) един метод (overload) означава да се предостави негова друга реализация с използване на различен брой или тип на параметрите. В един клас могат да се дефинират методи с едно и също име, но сигнатурата им трябва да е различна. За да се считат за един метод, реализиращ статичен полиморфизъм, методите с еднакви имена трябва да връщат един и същ тип.
Пр. 1
class Equality(){
static boolean intEqual(int i, int j){return i==j;}
static boolean intEqual(int i, double d){return i==(int)d;}
static boolean intEqual(double d, int j){return (int)d==j;}
static boolean intEqual(double d, double e){return (int)d==(int) e;}
static boolean intEqual(int i, char c){return i==(int)c;}
static boolean intEqual(char c, int j){return (int)c==j;}
static boolean intEqual(char c, char d){return (int)c==(int)d;}
}
//използване
if(Equality.intEqual(x, y)){//в зависимост от типа на х и у ще
//се извивка метод
…
}
Динамичен полиморфизъм – да се предефинира (динамично) или преопредели един метод (override) означава да се предостави нова реализация на дадения метод, различна от наследената от суперкласа реализация. Новата реализация в подкласа има същото име, същия брой и тип на параметрите и връща същия резултат като реализацията на метода в подкласа.
Пр. 2
import java.io.*;
class Base {
int a = 1;
void printing() {
System.out.println(“Печата в клас Base”);
}
void basing(){
System.out.println(“Метод на класа Base”);
printing();
System.out.println(“Стойността на променливата е:”+a);
}
}
class New extends Base{
int a = 2;
void printing(){
System.out.println(“Печата в клас New”);
}
}
class OverrideTest {
public static void main(String[]) throws IOException {
System.out.println(“Използваме обект на клас Base…”);
Base b = new Base();
b.printing();
b.basing();
System.out.println(“Използваме обект на клас Newt…”);
New n = new New();
n.printing();
n.basing();
}
}
Един клас може да бъде дефиниран като последен със служебната дума final. Такъв клас не може да бъде наследяван, т.е. не може да има подкласове. Създаването на класове final позволява защита на информацията. Методите от тип последен също се дефинират със служебната дума final и не могат да се преопределят в подкласовете.
Абстрактни методи и класове – това са методи, които са обявени в един клас, но не са реализирани в него. Такъв клас се нарича абстрактен, явявайки се всъщност само шаблон. Действиетелната реализация на метода се предоставя на подкласовете посредством преопределяне. В Java за указване на абстрактен метод се използва ключовата дума abstract.
Пр. 3
abstract class Shape {
//абстрактния метод getArea() се реализира от
// подкласа
public abstract double getArea();
…
}
Класът Shape е обявен с ключовата дума abstract, показваща, че даденият клас включва в себе си един абстрактен (или нереализиран) метод. Това означава, че в действителност не може да бъде създаден обект от класа Shape, а само обекти от подкласовете, които осигуряват реализацията на метода getArea().
Класът, съдържащ абстрактни методи се нарича абстрактен, в противен случай – функционален.
Интерфейс – това е начин на задължаване на класовете да имат определени свойства. Той по структура прилича на класа, като включва полета и методи, но се различава от него по това, че не може да се създават негови екземпляри. Методите в интерфейса не трябва да се реализират, а полетата могат да бъдат само константи.
На интерфейса може да се гледа като на абстрактен клас, съдържащ само абстрактни методи и константи.
Пр. 4
interface Helpable {
public void help();
}
Интерфейсът в Java се използва, когато се създава клас, който го реализира. Реализацията означава включване на реализации на всички методи на интерфейса в класа. За да се укаже, че дадения Java клас реализира методите на определения интерфейс, се използва служебната дума implements. Всеки клас може да реализира неограничен брой интерфейси.
Пр. 5
class Topic implements Helpable {
String strNameTopic;
public void help() {
System.out.println(“Помощ за ”+strNameTopic);
}
}
Интерфейсите могат да се наследяват и синтаксисът на интерфейса в общия случай е следния:
[public] interface <име> [extends <интерфейс>…] {
//тяло, съдържащо заглавни редове на методи и константи
}
Където тялото съдържа само заглавни редове на методи и константи, а модификаторът за достъп public се използва, ако интерфейсът ще бъде използван извън пакета. За разлика от класа, всеки интерфейс може да наследява много интерфейси. (Класът може да наследява един клас, но да реализира много интерфейси.)
В интерфейсът може да се използва в качеството на тип данни. Може да се обявяват променливи от тип интерфейс. Всеки обект от клас, реализиращ интерфейса, може да се присвои на присвои на променлива от типа на интерфейса.
Popularity: 1% [?]
No related posts.
Related posts brought to you by Yet Another Related Posts Plugin.
RSS Feed
Twitter

януари 26th, 2010
admin
Posted in 
