PHP ontwerp vraag, interfaces en extends

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
Ik heb een ontwerp vraagje, ik heb momenteel de volgende basis klasse model:

PHP:
1
2
3
4
5
6
7
8
9
10
11
class model {
     public function blaat1{
          ...
     }
 public function blaat2{
          ...
     }
 public function blaat3{
          ...
     }
}


Dan een 12 tal subclasses die deze classe extenden, werkt allemaal perfect, maar nu het volgende, al deze subclasses hebben een functie blaat4() waarvan de inhoud per subclasse verschilt.
Ik wil dus graag een interface gebruiken waarin het volgende staat:

PHP:
1
2
3
interface models{
     public function blaat4();
}


Zodat in alle subklasses deze functie heb onder dezelfde naam.

Wat is dan de oplossing?
1) in de subclasse:
PHP:
1
2
3
4
require_once("interfaces/models.php");
class subclass1 extends model implements models {
...
}


of

2) in de basis/parent klasse:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
require_once("interfaces/models.php");
class model implements models {
     public function blaat1{
          ...
     }
 public function blaat2{
          ...
     }
 public function blaat3{
          ...
     }
}

Waardoor dus automatisch alle subklasse zich ook aan de interface moeten houden (althans dat is het idee)

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15:19

Janoz

Moderator Devschuur®

!litemod

Welke oplossing je zou moeten gebruiken is sterk afhankelijk van wat de superclass en de interface nu eigenlijk betekenen. Zolang je je naamgeving dus niet verder brengt dan model, models en blaat is er geen zinnig woord over te zeggen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Op het moment dat je de base class de interface laat implementeren, forceer je de functie in de base class. Dan ben je net zover als dat je die functie gewoon in de base class zet.

Wil je van je child classes een voorgedefineerde maar onbekende functie hebben, dan moet je die met de interface implementeren afaik :) Ik heb het niet geprobeerd, maar volgens mij kan dit niet:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
interface iModule{
  public function getSomething();
}

abstract class baseModule implements iModule{
  public function foo(){}
  public function bar(){}
}

final class specificModule extends baseModule{
  public function getSomething(){}
}
Of begrijp ik je verkeerd?

Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
@Janoz: bedankt voor de reactie, het was echter een behoorlijke lap code en werking.
mithras schreef op dinsdag 11 november 2008 @ 18:17:
Wil je van je child classes een voorgedefineerde maar onbekende functie hebben, dan moet je die met de interface implementeren afaik :) Ik heb het niet geprobeerd, maar volgens mij kan dit niet:
...
Of begrijp ik je verkeerd?
Je begrijpt me goed, ik heb het net getest en het is inderdaad gewoon niet mogelijk (eigenlijk ook logisch nu ik het even wat rust had gegeven :+ )

Ik heb nu dus in alle subclasses een extend en implements, probleem opgelost ;)
bedankt!

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15:19

Janoz

Moderator Devschuur®

!litemod

Bedoel je dan niet gewoon
PHP:
1
2
3
4
5
6
7
8
9
abstract class baseModule{
  public function foo(){}
  public function bar(){}
  abstract public function getSomething();
}

final class specificModule extends baseModule{
  public function getSomething(){}
}


@Sjoerd:

Het gaat niet om je lappen code, het gaat om wat nu daadwerkelijk het doel/ de verantwoordelijkheid van elk van die classes en van de interface is en hoe dat zich tot elkaar verhoud.

[ Voor 20% gewijzigd door Janoz op 11-11-2008 20:24 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'