Một abstract contract sẽ được khai báo bằng từ khóa abstract
.
Khác với interface, abstract contract có thể có function implementation. Và chỉ cần có ít nhất một hàm không được implement, contract đó sẽ được xem là abstract contract.
Ví dụ minh họa:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
abstract contract Feline {
int public age;
// not implemented.
function utterance() public virtual returns (string memory);
// implemented.
function setAge(int _age) public {
age = _age;
}
}
Các hàm được đánh dấu là virtual
thì có thể được override bởi các child contract. Ví dụ:
contract Kitty is Feline {
function utterance() public pure override returns (string memory) {
return "Meow";
}
}
Một số điểm khác biệt quan trọng giữa interface và abstract contract:
- Interface bắt buộc không có implementation, nhưng abstract contract có thể có nhiều implementation miễn sao có ít nhất một hàm không được implement.
- Tất cả các hàm trong interface cần phải sử dụng visibility là
external
vì chúng chỉ có thể được gọi bởi các contract bên ngoài mà có implement interface đó. - Interface không thể có constructor, abstract contract thì có thể có.
- Interface không thể có state variable, abstract contract thì có thể có.