CodeGym /Java tanfolyam / /Egy interfész több, mint interfész. Ez egy viselkedés.

Egy interfész több, mint interfész. Ez egy viselkedés.

Szint , Lecke
Elérhető

"Helló, Amigo! Én vagyok az – már megint. Szeretnék egy másik nézőpontot adni az interfészekről. Látod, egy osztály legtöbbször egy adott objektum modellje. Ezzel szemben az interfészek inkább egy objektum képességeihez ill. a szerepeket, nem pedig magát a tárgyat."

Például az olyan dolgokat, mint az autók, kerékpárok, motorkerékpárok és kerekek a legjobban osztályokként és tárgyakként ábrázolják. De az olyan képességeik, mint a „mozoghatok”, „tudok embereket szállítani” és „ tudok parkolni”, jobban ábrázolhatók interfészként. Nézze meg ezt a példát:

Java kód Leírás
interface Moveable
{
void move(String newAddress);
}
Megfelel a mozgásképességnek.
interface Driveable
{
void drive(Driver driver);
}
Megfelel a mozgásképességnek.
interface Transport
{
void addStuff(Object stuff);
Object removeStuff();
}
Megfelel a rakomány szállításának képességének.
class Wheel implements Moveable
{
...
}
Egy "kerék" osztály. Mozgási képességgel rendelkezik.
class Car implements Moveable, Drivable, Transport
{
...
}
Egy "autó" osztály. Képes mozogni, személy által vezetni és rakományt szállítani.
class Skateboard implements Moveable, Driveable
{
...
}
Egy „gördeszka” osztály. Képes mozogni és egy személy irányítani.

Az interfészek nagyban leegyszerűsítik a programozó életét. A programok gyakran több ezer objektumot, több száz osztályt és mindössze néhány tucat interfészt (szerepkört) tartalmaznak. Kevés a szerepkör, de sokféleképpen kombinálhatók (osztályok).

A lényeg az, hogy nem kell kódot írnod, amely meghatározza az interakciót minden más osztállyal. Mindössze annyit kell tennie, hogy interakcióba lép a szerepekkel (interfészek).

Képzeld el, hogy robotépítő vagy. Több tucat alárendelt robotja van, és mindegyiknek több képessége is lehet. Tegyük fel, hogy sürgősen be kell fejeznie egy fal építését. Csak vedd az összes olyan robotot, amelyik képes "építeni", és mondd meg nekik, hogy építsenek falat. Nem igazán érdekel, hogy melyik robot csinálja. Legyen ez egy robotos öntözőkanna. Ha tudja, hogyan kell építeni, hagyja, hogy építsen.

Így nézne ki kódban:

Java kód Leírás
static interface WallBuilder
{
void buildWall();
}
Képes "falat építeni". Megérti a «falat építs» parancsot (megvan a megfelelő módszere).
static class WorkerRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class GuardRobot implements WallBuilder
{
void buildWall()
 {
…
 }
}
static class WateringCan
{
…
}
Robotok, amelyek rendelkeznek ezzel a képességgel/készséggel.

Egy öntözőkanna nem tud falat építeni (nem valósítja meg a WallBuilder interfészt).

public static void main(String[] args)
{
 //add all robots to a list
 ArrayList robots = new ArrayList();
 robots.add(new WorkerRobot());
 robots.add(new GuardRobot());
 robots.add(new WateringCan());

 //build a wall if you can
 for (Object robot: robots)
 {
  if (robot instanceof WallBuilder)
  {
   WallBuilder builder = (WallBuilder) robot;
   builder.buildWall();
   }
  }
 }
}
Hogyan adjuk ki a parancsot a fal építésére?

"Ez elképesztően érdekes. Álmomban sem gondoltam volna, hogy az interfészek ilyen érdekes téma lehet."

"És aztán néhány! A polimorfizmussal együtt teljesen észbontó."

Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION