Since ERC165 is an abstract contract that implements IERC165, why not just do:
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165) returns (bool)
Yet, in contracts like ERC721, it's done as follows:
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool)