Абстрактное ключевое слово в PHP - PullRequest
7 голосов
/ 05 декабря 2009

Эй, у меня достаточно опыта работы с PHP, но я понятия не имею, что делает ключевое слово abstract, когда дело доходит до объектно-ориентированного программирования. Кто-нибудь может объяснить простым языком, для чего он может быть использован?

В каких ситуациях я бы использовал абстрактное ключевое слово? Как это меняет класс / интерфейс?

Ответы [ 5 ]

16 голосов
/ 05 декабря 2009

(Надеюсь, это достаточно просто - я не думаю, что смогу сделать лучше ^^)

Класс abstract не может быть создан: вы можете создать только другой класс, который наследуется от класса abstract, и создать экземпляр этого дочернего класса.

И если вы объявите некоторые методы как abstract, они должны быть определены в дочернем классе, чтобы этот метод был инстанцируемым.

7 голосов
/ 05 декабря 2009

Объявление абстрактного класса означает, что он должен быть разделен на подклассы для использования. Абстрактный класс не может быть создан. Можно рассматривать его как расширенный интерфейс, который может включать код реализации (в отличие от интерфейса).

Объявляя реферат метода, вы заставляете подкласс реализовывать метод.

2 голосов
/ 05 декабря 2009

Определение упомянуто выше, сейчас я попытаюсь привести пример:

«абстрактный» гарантирует, что вы следуете определенной логике, например, материал билета ВСЕГДА "бумажный", или кредитная карта всегда должна иметь "код". Это важно, если вы работаете в большой компании со строгой стандартизацией или если вы хотите «заставить» своих разработчиков следовать определенной структуре, чтобы их код не оказался в беспорядке.

    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;
    }
}

Если мы не определим метод "setCode", синтаксический анализатор вернет ошибку "new anotherKey"

1 голос
/ 05 декабря 2009

Абстрактные классы используются для фактических отношений типа модели. Это позволяет, например, драйверу базы данных отображать иерархию, в которой ставится задача предоставить общий базовый класс, сигнатуры для методов реальных классов драйверов. Реализация затем выполняется в соответствии с заранее определенными сигнатурами в фактических классах драйверов.

вот пример кода

<?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 голосов
/ 05 декабря 2009

Хотя вы не можете создать экземпляр абстрактного класса, вы можете объявить конкретные методы / свойства / переменные (в C #, AFAIK), которые будут доступны производному классу

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");
        }
    }
...