"polymorphism needs something other than interface, that is factories, without them, you can not switch between concreate classes without hard code IFoo foo = new ConcreateFoo(); I think factories is not introduce by oo languages themselves, but soon the programmer found they are important." . . . .