ابسترکشن (Abstraction) که در منابع فارسی به آن «انتزاع» هم میگویند، پنهان کردن جزئیات غیرضروری و ارائه قراردادی واضح برای قابلیتهای ضروری است. ابسترکشن به PHP محدود نیست و در پایتون، Go، C#، Java و بسیاری زبانهای دیگر وجود دارد.
فرق Abstract Class با Interface
| ویژگی | Abstract Class | Interface |
|---|---|---|
| هدف | اشتراک قرارداد و گاهی پیادهسازی پیشفرض | تعریف قابلیت یا قرارداد مورد انتظار |
| State | معمولا میتواند State و Constructor داشته باشد | در زبانها قواعد متفاوتی دارد و معمولا محور آن قرارداد است |
| ارثبری | در بسیاری از زبانها فقط یک کلاس پایه | میتوان چند Interface را پیادهسازی کرد |
| مناسب برای | چند نوع دارای رفتار مشترک واقعی | چند پیادهسازی متفاوت با قابلیت مشترک |
نمونه PHP
interface PaymentGateway { public function charge(int $amount): void; }
abstract class LoggedGateway implements PaymentGateway {
protected function log(int $amount): void { /* log request */ }
}
نمونه Python
from abc import ABC, abstractmethod
class PaymentGateway(ABC):
@abstractmethod
def charge(self, amount: int) -> None: ...
نمونه Go
type PaymentGateway interface { Charge(amount int64) error }
// Go uses interfaces and composition rather than class inheritance.
نمونه C#
public interface IPaymentGateway { Task ChargeAsync(decimal amount); }
public abstract class GatewayBase {
protected void Log(string message) { /* ... */ }
}
اشتباه رایج
هر Interface یا کلاس Abstract لزوما انتزاع خوب نیست. اگر قرارداد مفیدی ایجاد نکند، فقط تعداد فایلها و وابستگیها افزایش پیدا میکند.
مقایسه با اینترفیس، انکپسولیشن و تزریق وابستگی را ببینید.