Remove abstract class and use Interface+Trait

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | yes
| Deprecations? | yes
| Tests pass?   | yes
| Fixed tickets | -
| License       | MIT
| Doc PR        | -

Why do we need to close the inheritance if we can use our existing interface/trait? This PR will provide trait+interface instead of abstract class, that will allow to improve inheritance and allow to the class to extends another with real advantage if it needed.
please don't duplicate classes