Interesting discussion going on in here :). Beside defining abstraction using philosophical terminology, I would like to say about abstraction, it is a way to define a high level full or partial definition of a type in programming paradigm.
Now there would be an argument why don't we use inheritance then, there is good article about it in
here[
^]. In addition, difference between
abstract and interface[
^].
And finally to get a idea about how to define or use abstract concept in C# programming language please read
this[
^].
:)