mustoverride

Status
Niet open voor verdere reacties.

bn2vs

Terugkerende gebruiker
Lid geworden
18 aug 2007
Berichten
1.705
Hey,

Ik vermoed van niet, maar ff voor de zekerheid: is er een 'mustoverride' keyword, of iets wat ermee overeen komt zoals in .Net?

Cheers
BN
 
Ik ken .net niet, maar als je bedoelt met 'mustoverride' dat je een functie defineert in een Class die je moet overriden in de extend daarvan, wat dus ook betekend dat je de Class zelf niet mag instantieren, dan ben je op zoek naar Abstract:

PHP:
abstract class A {
  // deze functie MOET overschreven worden in een class die A extend, en je kunt A niet instantieren
  abstract function doeIets();
}

class B extends A {
  function doeIets() {
    // hier komt dan de echte functie
  } 
}

// dit mag
$b = new B;

// dit geeft een Fatal Error: cannot instantiate abstract class A
$a = new A;

Als dat het niet is, moet je even uitleggen wat mustoverride precies betekend :)
 
Hey,

Dat is bijna wat ik bedoel, maar er zit een klein verschil: doeIets moet niet abstract zijn in A. Dus een functie met een body, die toch overschreven moet worden in elke base class.

Cheers
BN
 
Ook dat kan:

PHP:
class Main{

 public function x(){

    return 1 + 1;
 
  }

}


interface iSub{

 public function x();

}


class Sub extends Main implements iSub{

 public function x(){
 
   return 1 + 2; 

 }

}

Het is alleen niet helemaal waterdicht, omdat nu beide x-functies public zijn en je in je interface ook public afdwingt. Dat betekent dat als je x() in Sub weglaat, hij ook werkt omdat er in de Main nog een public x() zit.

Waarom wil je dit eigenlijk precies?
 
Laatst bewerkt:
:eek: Nice. Nog nooit een interface gezien in PHP.

Dit ga ik zeker gebruiken, maar het is spijtig dat het niet zonder die interface kan.

Dat betekent dat als je x() in Sub weglaat, hij ook werkt omdat er in de Main nog een public x() zit.
Ik neem aan dat je het zelfde probleem hebt als je bijde methods protected hebt?

Btw, is het mogelijk om af te dwingen in die method in je sub class dat je er de originele in de base class aanroept? Zoals dit:

PHP:
class Sub extends Main implements iSub{
 public function x(){
   parent->x();
   return 1 + 2; 
 
 }
}

EDIT: Ik wil dit dus gebruiken om verplicht een method 'uit te brijden'. Is deze aanpak verkeerd ofzo? En zoja, hoe kan het beter? :)
 
Laatst bewerkt:
Volgens mij kan dat gewoon met parent::x();.
 
Ja, dat weet ik, maar kan ik AFDWINGEN dat je dat doet? Nee zeker?
 
Nee, dat dan weer niet.

Nogmaals; waar is het precies voor?
 
Ik wil dit dus gebruiken om verplicht een method 'uit te brijden'. Is deze aanpak verkeerd ofzo? En zoja, hoe kan het beter?
 
Ja, en dat begrijp ik dus niet precies. Kun je het niet toelichten met een concreet voorbeeld?
 
Ik heb een zooi classes die iets van mapping functionaliteit aanbieden. Een deel ervan komt overal voor logisch), en zit dus in een parent class die ze allemaal inheritten. Nu heb ik een functie in die parent class die een zooi code bevat.

PHP:
class Main{
 
 protected function x(){
 
    // Zooi code
 
  }
 
}

Nu wil ik dat elke class die Main inherit dezelfde functie x() hebben, maar dan met extra code erbij. Dus moet in elke sub class in functie x die van de parent eerst worden aangeroepen.

PHP:
class Sub extends Main implements iSub{
 protected function x(){
   parent::x();
   // Code specifiek voor deze class
 }
}

Of is dat helemaal niet logisch ofzo? :D
 
Dat klinkt echt gewoon als een abstract class :p

PHP:
abstract class A {
  function Parent () {
    return $this->Child() + 1;
  }

  abstract function Child();
}

class B extends A {
  function Child() { 
    return 2;
  }
}

Zolang de functies niet dezelfde naam hebben kun je het perfect implementeren op deze manier :)
 
Hey

Dan was ik dus toch verkeerd bezig :) Thnx voor de oplossing :D

Cheers
BN
 
Hey,

Ik heb hier toch problemen mee. Alle functies in myn situatie zyn static.

Deze declaratie & call
Code:
	protected abstract static function setFormInputSettings();

Code:
	public final static function formInputHTML($coordinates, $input_name, $is_mandatory, $is_disabled, $field_args) {
		SMFormInput::setFormInputSettings();
Resulteren in
Fatal error: Cannot call abstract method SMFormInput::setFormInputSettings()

Hoe kan ik dat oplossen? :)

Cheers
BN
 
Eh, roep je de abstracte versie aan? Want dat is namelijk niet toegestaan... en omdat het static is, gaat ie altijd naar die class toe.

PHP:
class A {
  static abstract function A ();
}

class B extends A {
  function A () {
    return 1;
  }
}

// dit kan, want hij gaat nu naar B en die extend van A
B::A();
// dit kan nog steeds niet, want in A zelf is de functie abstract
A::A();

Althans, als ik het probleem goed begrijp.
 
PHP:
abstract class A {
  static abstract function A ();

  static function beeeh() {
  // hier wil ik A() aanroepen  - wat volledig gaat als deze method niet static is, mar blijkbaar niet als dat wel zo is
  }
}
 
class B extends A {
  function A () {
    return 1;
  }
}

Eigenlijk gewoon zoals jij in je post van 20 juli suggereerde.

Ik heb zo het vermoeden dat dit gwn niet mogelijk is als je het gvanuit een static method doet. Iemand een idee hoe je een gelijkaardig resultaat kunt berijken?

Cheers
Jeroen
 
Laatst bewerkt:
Hm. Dat is helaas nog niet mogelijk, als het goed is komt dat met PHP 5.3 er in.
Ik weet niet hoe ver ze zijn, maar die zou binnenkort eens uit moeten komen :)

Tot die tijd zou je de class gewoon kunnen instantieren, eventueel zo dat je maximaal 1 instantie mag hebben. Dan is het wel toegestaan, moet je alleen zorgen dat je de instantie op kunt vragen, bijv zo:

PHP:
abstract class A {
  abstract function A ();
  function B () {
    return $this->A() + 1;
  }
}

class B extends A {

  private $reference = null;

  // je kunt niet new B doen, behalve in class B zelf.
  // dit zorgt ervoor dat er nooit meer dan 1 instantie van B is, zodat je hem nog steeds kunt behandelen als static.
  private function __construct() {
  }

  function A() {
    return 1;
  }

  static function getB () {
    if ( self::$reference === null ) {
      self::$reference = new B;
    }
    return self::$reference;
  }
}
 
Ok, ik heb een dergelijk patroon toegepast, en het werkt zonder problemen :)

Zeker dat het in 5.3 kan? Ik vind geen docs over dat doen, ookal is die al 3 weken ofzo uit.

Thnx for the help :thumb:
 
Ohh zo. Dat zou ook gekunt hebben ja :)

Spijtig genoeg kan ik nog geen php 5.3 gebruiken voor hetgeen waar ik mee bezig ben (geen namespacez :() :(
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan