2009-12-05 15 views
6

Hola, tengo bastante experiencia con PHP pero no tengo idea de qué hace la palabra clave abstracta cuando se trata de programación orientada a objetos. ¿Alguien puede explicar en inglés sencillo para qué se puede usar?Palabra clave abstracta en PHP

¿En qué situaciones usaría la palabra clave abstracta? ¿Cómo cambia la clase/interfaz?

Respuesta

15

(Espero que esto es bastante simple - no creo que puedo hacerlo mejor ^^)

Una clase abstract no puede ser instanciado: sólo se puede crear otra clase que hereda de la clase abstract e instanciar esa clase de niños.

Y si declara algunos métodos como abstract, estos se deben definir en la clase secundaria, para que se pueda instanciar.

7

Declarar un resumen de clase significa que debe ser subclasificado para poder ser utilizado. Una clase abstracta no puede ser instanciada. Uno puede verlo como una interfaz extendida que podría incluir código de implementación (en lugar de una interfaz).

Al declarar un método abstracto, fuerza a la subclase a implementar el método.

0

Aunque no se puede crear una instancia de una clase abstracta, se puede declarar métodos/propiedades/variables concretas (en C#, que yo sepa) que estará disponible a la clase derivada

class Program 
    { 
     static void Main(string[] args) 
     { 
      Dog a = new Dog(); 
      //concrete properties and methods in abstract base class 
      //are available to derived class 
      a.Name = "SuperDog"; 
      a.EatFood(); 
      //And now calling Dog's method 
      a.Speak();    
      Console.WriteLine(a.GetType()); 

     } 
    } 

    public abstract class Animal 
    { 
     public string Name { get; set; } 
     public void EatFood() 
     { 
      Console.WriteLine("Eating.."); 
     } 
    } 

    public class Dog :Animal 
    { 
     public void Speak() 
     { 
      Console.WriteLine("Bow .. Bow"); 
     } 
    } 
1

La definición se ha mencionado anteriormente, ahora intentaremos darle un ejemplo:

"abstracto" asegura que usted sigue una lógica específica, por ejemplo el material de un ticket SIEMPRE es "papel", o una tarjeta de crédito siempre debe tener un "código". Esto es importante si trabajas en una gran empresa que tiene una estandarización estricta o si quieres 'forzar' a tus desarrolladores a seguir una estructura específica, para que su código no termine en un lío.

abstract class ticket{ 

    public function material() 
    { 
     return 'Paper'; 
    } 

} 

abstract class creditcard{ 

    public function material() 
    { 
     return 'Plastic'; 
    } 

    abstract function setCode(); // the ";" semicolon is important otherwise it will cause an error 

} 

class key extends ticket{ 

    public function getMaterial() 
    { 
     return parent::material(); 
    } 
} 

class anotherKey extends creditcard{ 

    public function setCode($code) 
    { 
     $this->code = $code; 
    } 
} 

Si no definimos el método "setCode" el analizador devolverá un error en "new anotherKey"

1

clases abstractas se utilizan para una relación real en su tipo-de-modelo. Esto permite, por ejemplo, un controlador de base de datos para mapear la jerarquía, con el objetivo de proporcionar una clase base común, las firmas para los métodos de las clases de controladores reales. La implementación se lleva a cabo de acuerdo con las firmas predeterminadas en las clases de controladores reales.

aquí es ejemplo de código

<?php 
abstract class AbstrakteKlasse { 
    public abstract function methode(); 
} 

class ImplementierendeKlasse extends AbstrakteKlasse { 
    public function methode() { 
    print "ImplementierendeKlasse::methode() aufgerufen.\n"; 
    } 
} 

$objekt = new ImplementierendeKlasse; 
$objekt->methode(); 
?> 
+0

.... Deutsch;) Sieht man hier Selten –

+0

ada por lo siento ;-) voluntad no sucederá la próxima vez ;-) – streetparade

+0

No hay problema;) Vengo de Alemania, también. Solo quería mencionar que usted escribió alemán en su código de ejemplo, lo que puede causar algún tipo de confusión si un programador no alemán intenta comprender el nombre real de sus clases. –

0

Abstract classes are classes that contain one or more abstract methods. An abstract method is a method that is declared, but contains no implementation. Abstract classes may not be instantiated, and require subclasses to provide implementations for the abstract methods.

1. No se puede crear una instancia de clase abstracta: Las clases definidas como abstracta no puede ser instanciada, y cualquier clase que contiene al menos un método abstracto debe ser también abstracto.

Ejemplo a continuación:

abstract class AbstractClass 
{ 

    abstract protected function getValue(); 
    abstract protected function prefixValue($prefix); 


    public function printOut() { 
     echo "Hello how are you?"; 
    } 
} 

$obj=new AbstractClass(); 
$obj->printOut(); 
//Fatal error: Cannot instantiate abstract class AbstractClass 

2.Cualquier clase que contenga al menos un método abstracto también debe ser abstracta.: La clase abstracta puede tener métodos abstractos y no abstractos, pero debe contener al menos un método abstracto. Si una clase tiene al menos un método abstracto, entonces la clase debe declararse abstracta.

Note: Traits support the use of abstract methods in order to impose requirements upon the exhibiting class.

Ejemplo a continuación:

class Non_Abstract_Class 
{ 
    abstract protected function getValue(); 

    public function printOut() { 
     echo "Hello how are you?"; 
    } 
} 

$obj=new Non_Abstract_Class(); 
$obj->printOut(); 
//Fatal error: Class Non_Abstract_Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Non_Abstract_Class::getValue) 

3. Un método abstracto no puede contener cuerpo: Métodos definidos como extracto simplemente declaran la firma del método - no pueden definir la aplicación. Pero un método no abstracto puede definir la implementación.

abstract class AbstractClass 
{ 
    abstract protected function getValue(){ 
    return "Hello how are you?"; 
    } 

    public function printOut() { 
     echo $this->getValue() . "\n"; 
    } 
} 

class ConcreteClass1 extends AbstractClass 
{ 
    protected function getValue() { 
     return "ConcreteClass1"; 
    } 

    public function prefixValue($prefix) { 
     return "{$prefix}ConcreteClass1"; 
    } 
} 

$class1 = new ConcreteClass1; 
$class1->printOut(); 
echo $class1->prefixValue('FOO_') ."\n"; 
//Fatal error: Abstract function AbstractClass::getValue() cannot contain body 

4. Cuando hereda de una clase abstracta, todos los métodos marcados resumen en declaración de la clase de los padres debe ser definido por el niño: Si hereda una clase abstracta que tiene que proporcionar implementaciones para todos los métodos abstractos en eso.

abstract class AbstractClass 
{ 
    // Force Extending class to define this method 
    abstract protected function getValue(); 

    // Common method 
    public function printOut() { 
     print $this->getValue() . "<br/>"; 
    } 
} 

class ConcreteClass1 extends AbstractClass 
{ 
    public function printOut() { 
     echo "swat"; 
    } 

} 
$class1 = new ConcreteClass1; 
$class1->printOut(); 
//Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue) 

5. Lo mismo (o una menos restringido) la visibilidad: Cuando hereda de una clase abstracta, todos los métodos marcados resumen en declaración de la clase de los padres debe ser definido por el niño; adicionalmente, estos métodos deben definirse con la misma (o menos restringida) visibilidad. Por ejemplo, si el método abstracto se define como protegido, la implementación de la función debe definirse como protegida o pública, pero no privada.

Note that abstract method should not be private.

abstract class AbstractClass 
{ 

    abstract public function getValue(); 
    abstract protected function prefixValue($prefix); 

     public function printOut() { 
     print $this->getValue(); 
    } 
} 

class ConcreteClass1 extends AbstractClass 
{ 
    protected function getValue() { 
     return "ConcreteClass1"; 
    } 

    public function prefixValue($prefix) { 
     return "{$prefix}ConcreteClass1"; 
    } 
} 
$class1 = new ConcreteClass1; 
$class1->printOut(); 
echo $class1->prefixValue('FOO_') ."<br/>"; 
//Fatal error: Access level to ConcreteClass1::getValue() must be public (as in class AbstractClass) 

6. Las firmas de los métodos abstractos deben coincidir: Cuando hereda de una clase abstracta, todos los métodos marcados resumen en declaración de la clase de los padres debe ser definido por el niño; las firmas de los métodos debe coincidir, es decir, las sugerencias de tipo y la cantidad de argumentos requeridos deben ser iguales. Por ejemplo, si la clase secundaria define un argumento opcional, donde la firma del método abstracto no lo hace, no hay conflicto en la firma.

abstract class AbstractClass 
{ 

    abstract protected function prefixName($name); 

} 

class ConcreteClass extends AbstractClass 
{ 


    public function prefixName($name, $separator = ".") { 
     if ($name == "Pacman") { 
      $prefix = "Mr"; 
     } elseif ($name == "Pacwoman") { 
      $prefix = "Mrs"; 
     } else { 
      $prefix = ""; 
     } 
     return "{$prefix}{$separator} {$name}"; 
    } 
} 

$class = new ConcreteClass; 
echo $class->prefixName("Pacman"), "<br/>"; 
echo $class->prefixName("Pacwoman"), "<br/>"; 
//output: Mr. Pacman 
//  Mrs. Pacwoman 

7. Clase abstracta no soporta herencia múltiple: Resumen lata clase extiende otra clase abstracta, la clase abstracta puede proporcionar la implementación de interface.But que no soporta la herencia múltiple.

interface MyInterface{ 
    public function foo(); 
    public function bar(); 
} 

abstract class MyAbstract1{ 
    abstract public function baz(); 
} 


abstract class MyAbstract2 extends MyAbstract1 implements MyInterface{ 
    public function foo(){ echo "foo"; } 
    public function bar(){ echo "bar"; } 
    public function baz(){ echo "baz"; } 
} 

class MyClass extends MyAbstract2{ 
} 

$obj=new MyClass; 
$obj->foo(); 
$obj->bar(); 
$obj->baz(); 
//output: foobarbaz 

Note: Please note order or positioning of the classes in your code can affect the interpreter and can cause a Fatal error. So, when using multiple levels of abstraction, be careful of the positioning of the classes within the source code.

ejemplo abajo hará que Fatal error: 'caballo' Clase no encontrada

class cart extends horse { 
    public function get_breed() { return "Wood"; } 
} 

abstract class horse extends animal { 
    public function get_breed() { return "Jersey"; } 
} 

abstract class animal { 
    public abstract function get_breed(); 
} 

$cart = new cart(); 
print($cart->get_breed());