Я работаю над механизмом, который должен настраиваться пользователем (не конечным пользователем, пользователем библиотеки) для использования различных компонентов.
Например, скажем, класс Drawer
должен иметь ITool
, Pencil
или Brush
и IPattern
, Plain
или Mosaic
. Также, скажем, Brush
должен иметь IMaterial
либо Copper
, либо Wood
Скажем, эффект выбора Pencil
или Brush
действительно радикально отличается, и то же самое относится к типу IPattern
. Будет ли плохой идеей кодировать класс Drawer
с помощью общих понятий, таких как:
public class Drawer<Tool, Pattern> where Tool: ITool where Pattern : IPattern { ... }
public class Brush<Material> where Material : IMaterial { ... }
Затем можно использовать этот класс как:
Drawer<Pencil, Mosaic> FirstDrawer = new Drawer<Pencil, Mosaic>();
Drawer<Brush<Copper>, Mosaic> SecondDrawer = new Drawer<Brush<Copper>, Mosaic>();
В основном я использовал дженерики для коллекций и тому подобного, и на самом деле не видел дженериков, используемых для такого рода вещей. Должен ли я?