Hackerboard WikiHaboBlog

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

problem mit vererbung und interface

Diskussion: problem mit vererbung und interface im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; heyho, ich hab hier ein kleines Problemchen. Ich habe folgendes Interface: PHP-Code: interface  SearchableInterface  {   public function  getId ();   public function  getObjectType ...

Antwort
Alt 15.02.10, 10:14   #1 (permalink)
 
Benutzerbild von b4ck
 
Registriert seit: 13.02.06
b4ck Leistung: Z3
Likes: 1
erledigt problem mit vererbung und interface


heyho,
ich hab hier ein kleines Problemchen.

Ich habe folgendes Interface:

PHP-Code:
interface SearchableInterface {

  public function 
getId();

  public function 
getObjectType();
  

  public function 
getSearchValues();

das von einer klasse zu implementieren ist.
diese klasse extended eine base-klasse und in der base-klasse ist die funktion getObjectType(); definiert.

d.h

PHP-Code:
class baseblubb {
  public function 
getObjectType() {
    return 
$this->ObjectType;
  }
}

class 
blubb extends baseblubb implements searchableinterface {
  public function 
getId() {
    return 
$this->id;
  }
  public function 
getSearchValues() {
     return array(
'blubb''bla');
  }

problem wenn ich das so mache krieg ich eine warnung das die klasse blubb die funktion getObjectType implementieren muss (logisch da das ja vom interface vorgeschrieben wird).

funktioniert soetwas generellt nicht das eine funktion aus einer parent klasse für ein interface verwendet werden kann?
und wie löse ich das problem jetzt am elegantesten?

Geändert von b4ck (15.02.10 um 15:11 Uhr)
b4ck ist offline   Mit Zitat antworten
Alt 15.02.10, 13:26   #2 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 75
Standard

Die Meldung wird verhindern wollen, dass die Basis-Klasse evtl. mal abgeändert wird und somit eine vererbte Methode plötzlich nicht mehr verfügbar ist.

Ich würde es so lösen:
PHP-Code:
class baseblubb {
  public function 
getObjectType() {
    return 
$this->ObjectType;
  }
}

class 
blubb extends baseblubb implements searchableinterface {
  public function 
getId() {
    return 
$this->id;
  }
  public function 
getSearchValues() {
      return array(
'blubb''bla');
   }
 
//Methode von Basis-Klasse durchschleifen, damit das Interface zufrieden ist:
  
public function getObjectType() {
      return 
parent::getObjectType();
   }
 } 
beavisbee ist offline   Mit Zitat antworten
   
HaBOT
 

Werbung ist gerade online    
Alt 15.02.10, 13:35   #3 (permalink)
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
BasicAvid Leistung: Facit NTK
Likes: 1
Standard

Oder Du implementierst das Interface in der Basis-Klasse und überlässt die konkrete Implementierung der konkreten Klasse.
__________________
Mfg Basic Avid
- Use it or be used! -
BasicAvid ist offline   Mit Zitat antworten
Alt 15.02.10, 13:45   #4 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 75
Standard

Zitat:
Zitat von BasicAvid Beitrag anzeigen
Oder Du implementierst das Interface in der Basis-Klasse und überlässt die konkrete Implementierung der konkreten Klasse.
sofern die Basis-Klasse halt auch searchable sein soll und somit searchableinterface als Interface in Frage kommt...
beavisbee ist offline   Mit Zitat antworten
Alt 15.02.10, 14:07   #5 (permalink)
Themenstarter
 
Benutzerbild von b4ck
 
Registriert seit: 13.02.06
b4ck Leistung: Z3
Likes: 1
Standard

das interface in der basisklasse implementieren geht nicht da die basisklasse kein searchable sein soll.

das ganze mit parent::getObjectType() funktioniert leider nicht da ich aus unerfindlichen gründen "segmentation fault" kriege was ich als extrem merkwürde empfinde *g*


--------------------
edit:

das problem ist gelöst.
ich hab im interface die methode: "getObjectType" in "getSearchObjectType" umbenannt.
wenn ich jetzt in der klasse
folgende funktion nehme:

public function getSearchObjectType() {
return parent::getObjectType();
}

haut alles hin.

danke für eure antworten.

Geändert von b4ck (15.02.10 um 14:24 Uhr)
b4ck ist offline   Mit Zitat antworten
Alt 15.02.10, 14:58   #6 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 75
Standard

Zitat:
Zitat von b4ck Beitrag anzeigen
das problem ist gelöst.
ich hab im interface die methode: "getObjectType" in "getSearchObjectType" umbenannt.
wenn ich jetzt in der klasse
folgende funktion nehme:

public function getSearchObjectType() {
return parent::getObjectType();
}

haut alles hin.
das ist eigentlich keine Lösung, sondern nur ein Work-Around....
Die Frage ist, woher der SegFault kommt....


also bei mir funktioniert folgender Code problemlos:
PHP-Code:
<?php

interface SearchableInterface {

  public function 
getId();

  public function 
getObjectType();
  

  public function 
getSearchValues();
}


class 
baseblubb
{
  protected 
$ObjectType="object_of_";
  
  public function 
__construct()
  {
      
$this->ObjectType.=get_class($this);
  }

  public function 
getObjectType() {
    return 
$this->ObjectType;
  }
}

class 
blubb extends baseblubb implements searchableinterface {
  public function 
getId() {
    return 
$this->id;
  }
  public function 
getSearchValues() {
      return array(
'blubb''bla');
   }
 
//Methode von Basis-Klasse durchschleifen, damit das Interface zufrieden ist:
  
public function getObjectType() {
      return 
parent::getObjectType();
   }
 }

$blaaaa=new blubb();
echo 
$blaaaa->getObjectType();
?>

Probier mal aus, ob der Code bei dir auch läuft - wenn ja, liegt dein Fehler noch wo anders, wenn nein, dann poste mal bitte deine PHP-Version...
beavisbee ist offline   Mit Zitat antworten
Alt 15.02.10, 15:14   #7 (permalink)
Themenstarter
 
Benutzerbild von b4ck
 
Registriert seit: 13.02.06
b4ck Leistung: Z3
Likes: 1
Standard

der von dir beschriebene code funktioniert ohne probleme.

was ich dazuschreiben sollte... der ganze code läuft innerhalb des symfony frameworks.
b4ck ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » PHP problem mit vererbung und interface
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61