An abstract contract implements only some of the declared functions, while leaving the others unimplemented. When choosing to use an abstract contract, it is typically because we have a group of contracts with a common functionality, but with additional unique functionality in each contract. So we implement this common functionality in the abstract contract, and we can therefore declare in this contract any state variable required for the implementation of this functionality.
An interface is a set of declared functions, none of which is implemented. When choosing to use an interface, it is typically because we have a group of contracts with a common set of functions, but with a different purpose (and therefore a different implementation) in each contract. Since none of the functions declared in the interface is implemented, state variables are kind of "inappropriate" in this scope, and the language does not permit them. In addition, all functions must be declared