Using interfaces won’t work because I want a single implementation. Using this solution would end in a lot of redundant code because I plan on having quite a few sub classes (composition vs inheritance). I’ve decided that a problem-specific design solution is what I’m looking for, and I can’t think of anything elegant.
Basically I want classes to have separate properties, and for those properties to be attached at design time to any sub class I choose. Say, I have class ‘ninja’. I would like to be able to make arbitrary sub classes such as ‘grayNinja’ where a gray ninja will always have a sword and throwing stars. Then possibly ‘redNinja’ who will always have a sword and a cape. Obviously swords, stars, and capes will each have their own implementation – and this is where I can’t use interfaces. The closest solution I could find was the decorator pattern, but I don’t want that functionality at runtime. Is the best solution an offshoot of that? Where inside the Black Ninja class constructor, I pass it through the constructors of sword and throwingStar? (those being abstract classes)
haven’t coded in a while and reading hasn’t gotten me too far – forgive me if the answer is simple.
Edit: Answered my own question. I can’t mark it as ‘answer’ until tomorrow. Please let me know if there’s a problem with it that I didn’t catch. All the reading this problem forced me to do has been awesome. Learned quite a bit.
Alright so mix-ins through extension methods are going to be my preferred route. I couldn’t figure out how to use dynamic proxies in vb.net (seemed to require libraries with lots of documentation that didn’t cover specifically what I needed). Dynamic proxies also seems to be a bit dirtier of a solution than using extension methods. Composition would have been what I defaulted to if the previous two didn’t work.
So one problem with extension methods, is that the code gets a little dirtier if you want to hold variables. Not much though. Another problem is that all the extension methods must be defined in modules, so the code might look a little goofy to a new eye. I will solve this by defining my interface and module with the corresponding extension method in the same file.
finally, here’s some sample vb.net code if you don’t want to see a full fledged example through the link.