php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 15.07.2010, 14:28  
Neuer Benutzer
 
Registriert seit: 12.05.2010
Beiträge: 22
PHP-Kenntnisse:
Anfänger
r2ls befindet sich auf einem aufstrebenden Ast
Standard Funktionen in vererbter Klasse deaktivieren

Hallo,

ich habe eine Klasse A mit den Funktionen F1, F2, F3.

Jetzt erstelle ich die Klasse B und erbe von der Klasse A. In der Klasse B soll aber nur der Zugriff auf Methode F1 möglich sein, nicht auf F2 und F3.

Kann ich das mit PHP umsetzen?
r2ls ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 15.07.2010, 14:34  
Erfahrener Benutzer
 
Registriert seit: 10.02.2009
Beiträge: 929
ragtek ist ein sehr geschätzer Menschragtek ist ein sehr geschätzer Menschragtek ist ein sehr geschätzer Menschragtek ist ein sehr geschätzer Mensch
Standard

HM, was sllte dsa bringen?

Möglichkeiten:

Methode F1 als private oder public deklarieren
F2 und F3 als protected (dann werden sie nicht weitervererbt)
ragtek ist offline   Mit Zitat antworten
Alt 15.07.2010, 14:49  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
F2 und F3 als protected (dann werden sie nicht weitervererbt)
Stimmt nicht. protected wird vererbt.
Zitat:
Methode F1 als private oder public deklarieren
Das bringt nichts. Nachträglich auf private setzen verletzt die Schnittstelle und ist syntaktisch verboten.

Ein Möglichkeit wäre, Die Methoden mit Dummys zu überschreiben (leere Funktionalität) oder mit Methoden, die bspw. eine Exception werfen.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online   Mit Zitat antworten
Alt 15.07.2010, 14:49  
Erfahrener Benutzer
 
Benutzerbild von jw-lighting
 
Registriert seit: 25.03.2009
Beiträge: 126
PHP-Kenntnisse:
Fortgeschritten
jw-lighting befindet sich auf einem aufstrebenden Ast
jw-lighting eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von ragtek Beitrag anzeigen
Methode F1 als private oder public deklarieren
F2 und F3 als protected (dann werden sie nicht weitervererbt)
Du verwechselst protected mit private und vice versa.

Geschützte (protected) Funktionen werden mit vererbt, sind aber auch dort nur innerhalb der Klasse verfügbar.
Private Methoden werden nicht vererbt und sind ebenfalls nur innerhalb der Klasse verfügbar.

Vom Design her wäre es schlauer, eine abstrakte Klasse zu definieren die die Schnittmengen zwischen beiden anderen Klassen darstellt, und diese dann zu erweitern.

EDIT: nikosch war schneller..

LG:
jw-lighting
__________________

Geändert von jw-lighting (15.07.2010 um 14:53 Uhr).
jw-lighting ist offline   Mit Zitat antworten
Alt 15.07.2010, 15:23  
Erfahrener Benutzer
 
Registriert seit: 10.02.2009
Beiträge: 929
ragtek ist ein sehr geschätzer Menschragtek ist ein sehr geschätzer Menschragtek ist ein sehr geschätzer Menschragtek ist ein sehr geschätzer Mensch
Standard

Ups sorry.

Aber wieso verletze ich die Schnittstelle?
Vlt ist es ja nicht beabsichtigt, dass die 2 von aussen aufgerufen werden sollen.

Persönlich finde ich das nachträgliche überschreiben viel grausamer.
Wenn sie nicht verfügbar sein soll, dann soll die Elternklasse dafür sorgen.
Wozu soll eine Methode in einer Kindsklasse verfügbar sein, wenn diese nicht aufrufbar sein darf.

Das einzige Szenario wo ich mir sowas vorstellen könnte, wäre eine API wo etwas gravierendes geändert wurde und man nun bitte Methode / Klasse xyz verwenden soll.
Das ist halt meine Sichtiweise.
ragtek ist offline   Mit Zitat antworten
Alt 15.07.2010, 15:43  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Wenn du ein Haustier haben willst, das zwei Beine und zwei Flügel hat - dann solltest du es nicht von zwei Säugetieren zeugen lassen.

Wenn deine Kindklasse etwas bestimmtes nicht können/dürfen soll - wieso soll sie dann bitte überhaupt von einer Elternklasse erben, die diese Fähigkeiten hat?

„Säugetier“ und „Vogel“ leiten sich beide von „Lebewesen“ ab.
Du willst aber offenbar „Vogel“ von „Säugetier“ ableiten.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 15.07.2010, 16:06  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Was Chris damit meint wäre

Klasse A mit F1
Klasse B erbt von A und definiert F2, F3
Klasse C erbt von A und definiert F4
cycap ist offline   Mit Zitat antworten
Alt 15.07.2010, 16:45  
Erfahrener Benutzer
 
Benutzerbild von jw-lighting
 
Registriert seit: 25.03.2009
Beiträge: 126
PHP-Kenntnisse:
Fortgeschritten
jw-lighting befindet sich auf einem aufstrebenden Ast
jw-lighting eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von ChrisB
„Säugetier“ und „Vogel“ leiten sich beide von „Lebewesen“ ab. Du willst aber offenbar „Vogel“ von „Säugetier“ ableiten.
Ich nehme an, du (TE) hast das bisher nicht gemacht/machen wollen da du für 'Lebewesen' keine eigene Verwendung hast.

Zitat:
Vom Design her wäre es schlauer, eine abstrakte Klasse zu definieren die die Schnittmengen zwischen beiden anderen Klassen darstellt, und diese dann zu erweitern.
Um das Problem zu lösen gibt es, wie ich angesprochen hatte, die Möglichkeit eine Klasse (oder auch Methoden) als abstrakt zu definieren, d.h. das sie eine Grundlage darstellt die von Kindklassen erweitert werden MUSS, und so noch nicht instanziert werden darf.

PHP-Code:
abstract class Foo{

   function 
foo(){
      
// ...
   
}
}

class 
Bar extends Foo{

   function 
Bar(){
      
// ...
   
}
}

class 
Baz extends Foo{

   function 
baz(){
      
// ...
   
}

LG
__________________
jw-lighting ist offline   Mit Zitat antworten
Alt 15.07.2010, 16:48  
Neuer Benutzer
 
Registriert seit: 12.05.2010
Beiträge: 22
PHP-Kenntnisse:
Anfänger
r2ls befindet sich auf einem aufstrebenden Ast
Standard

ich dachte an sowas wie sealed in c#, aber das verhindert auch nur weiteres überschreiben.

über Klasse A sitzt noch eine abstrakte Klasse und ein Interface mit jeder Menge Logik. Es sind bereits alle Methoden F1, F2, F3 im Interface defniert. Dann müsste man die Struktur doppelt anlegen und die ganze Logik davon auslagern (automatisches Suchen von Klassenpfaden, viel statisches).

Ich werde dann wohl doch auf die unschönere Methoder gehen und leer überschreiben.
r2ls ist offline   Mit Zitat antworten
Alt 15.07.2010, 17:19  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Aber wieso verletze ich die Schnittstelle?
Weil eine einmal publizierte Methode nicht nachträglich eingeschränkt werden darf. Wenn A::foo() public ist und B:foo() private (B extends A), dann beendet B effektiv den weiteren Vererbungsbaum. Allgemeiner gefasst stellte dann jede Vererbung einer Vererbung eine potentielle Entwertung des Objekts dar. Stell Dir nur mal vor, Du gibst als Type-Hint A an, dann kannst Du B zwar übergeben, aber effektiv kann der Kontext trotzdem nicht sicher sein, dass die Schnittstelle noch konsistent ist, weil es eben B:foo() gar nicht mehr aufrufen könnte. Noch klarer wird das bei der Verwendung von Interfaces. Wenn A ein Interface mit foo() bedient, würde B (das ja die Implementierung erbt) nicht mehr das Interface repräsentieren (bzw. anders herum).

Zitat:
Vlt ist es ja nicht beabsichtigt, dass die 2 von aussen aufgerufen werden sollen.
Dann sollte man eben auch nur F1 als Schnittstelle definieren und den Rest entweder protected anlegen oder nur eine Ableitung zwischenschieben.

Zitat:
Persönlich finde ich das nachträgliche überschreiben viel grausamer.
Wenn sie nicht verfügbar sein soll, dann soll die Elternklasse dafür sorgen.
Nein das ist falsch. Die Elternklasse weiß ja nicht, dass sie Elternklasse ist. Ergo auch nichts über die Kinder, erst recht nicht über implementierte Funktionalitäten. Im Übrigen kann es durchaus sinnvolle Anwendungen für Methoden geben. Nimm das Beispiel „Automat wechselt nicht“. Briefmarkenautomat extends Selbstbedienungsautomat. gebeWechselgeld() ist dann eben eine Dummymethode, die aber trotzdem das Interface bedient, auf das vielleicht ein Objekt Automatentastatur oder Automatenprozessor aufsetzt.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Klasse aus einer anderen Klasse aufrufen Tobby PHP-Fortgeschrittene 7 14.07.2010 20:05
[Erledigt] klasse für ein paar funktionen? Codercrush Software-Design 2 17.05.2010 16:49
Statische Methode bei Vererbter Klasse Puccini PHP-Fortgeschrittene 7 14.03.2010 20:39
[Erledigt] Nur einer bestimmten Klasse Zugriff andere Klasse erlauben Turamisi Software-Design 2 20.02.2010 20:31
[Erledigt] Funktionen in der selben Klasse aufrufen Lollix PHP Tipps 2010 4 17.02.2010 19:32
Klasse für Objekteigenschaft erzeugen? Asipak PHP-Fortgeschrittene 25 30.05.2009 19:45
[Erledigt] Gültigkeitsbereiche / Klasse / Variablen / Funktionen Veqeta PHP Tipps 2009 7 14.05.2009 11:32
Methode einer anderen Klasse aufrufen Luka PHP-Fortgeschrittene 15 09.11.2008 14:19
[Erledigt] Klasse / Funktionen verwenden PHP4ever PHP Tipps 2008 7 27.07.2008 16:24
welche funktionen deaktivieren brian johnson PHP-Fortgeschrittene 4 15.11.2007 09:25
String-Parser Klasse - was muss rein? Matze PHP Tipps 2007 2 08.04.2007 22:14
seiten / Funktionen - aktiveren/ Deaktivieren annaloga PHP Tipps 2006 4 18.04.2006 09:33
[Erledigt] Funktionen in einer Klasse 'registrieren' bzw. includieren ? PHP-Fortgeschrittene 1 16.07.2005 13:23
Javascript funktionen deaktivieren! Kori HTML, Usability und Barrierefreiheit 16 10.07.2005 22:28

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
vererbung von funktionen aufheben html, briefmarkenautomat c#, funktion deaktivieren html, c# geerbte funktion sperren, php class aktivieren, php klasse deaktivieren, php class beenden, php zugriff klassen sperren, php5 funktionen nicht vererben, funktion in php deaktivieren, class deaktivieren, php klasse funktionen sperren, php funktion entfernen ableitung, vererbte funktionen sperren, c# geerbte methoden sperren, funktions sicherheit ausschalten, c# bestimmte funktionen einer klasse abschalten, briefmarkenautomat, c#, php nicht vererbte funktionen, php funktion als überschreibbar deklarieren

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:39 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum