در زبان برنامهنویسی سالیدیتی، هنگامی که یک کلاس را با کلیدواژه `abstract` تعریف میکنید، به عنوان یک کلاس انتزاعی (abstract class) شناخته میشود. یک کلاس انتزاعی نمیتواند مستقیماً از آن شیء ایجاد کند (با استفاده از عبارت `new`). این به این معنی است که نمیتوانید نمونهای از کلاس انتزاعی بسازید، بلکه باید از کلاسهای فرزندی (کلاسهایی که از کلاس انتزاعی مشتق شدهاند) نمونهبرداری کنید.
معمولاً کلاسهای انتزاعی برای تعریف الگوهای عمومی و مشترک استفاده میشوند، و به دلیل عدم وجود پیادهسازی کامل برای تمامی روشها و ویژگیها، ایجاد نمونه مستقیم از آنها معنایی ندارد.
برای استفاده از کلاس انتزاعی در سالیدیتی، باید یک کلاس فرزند (کلاسی که از کلاس انتزاعی مشتق شده است) تعریف کنید و تمامی روشهای انتزاعی کلاس والد را پیادهسازی کنید. سپس از این کلاس فرزند میتوانید نمونهبرداری کنید و از روشهای آن استفاده کنید.
در مثال زیر، یک کلاس انتزاعی به نام `Animal` تعریف شده است. برای استفاده از آن، باید یک کلاس فرزندی (مانند `Dog`) تعریف کنید که تمامی روشهای انتزاعی کلاس `Animal` را پیادهسازی کند.
```solidity
abstract contract Animal {
function speak() public virtual returns (string memory);
}
contract Dog is Animal {
function speak() public override returns (string memory) {
return "Woof!";
}
}
contract MyContract {
Animal public myAnimal;
constructor() {
myAnimal = new Dog();
}
function getAnimalSound() public view returns (string memory) {
return myAnimal.speak();
}
}
```
در این مثال، کلاس `Animal` کلاس انتزاعی است که یک روش انتزاعی به نام `speak` دارد. کلاس `Dog` از `Animal` مشتق شده است و روش `speak` را پیادهسازی میکند. در کلاس `MyContract` نیز از کلاس `Dog` برای ایجاد نمونه از `Animal` استفاده شده است و میتوان از روش `speak` در `myAnimal` استفاده کرد.
لازم به ذکر است که مثال بالا صرفاً برای توضیح مفهوم کلاسهای انتزاعی در سالیدیتی است و نیازمندیهای واقعی برنامه خود را میتوانید با توجه به مورد استفاده خاص خود تنظیم کنید.