Вам необходимо отменить запись в главный байт-фрагмент во время рекурсивного отслеживания:
if mstr[index] == q {
mstr[index] = a
allstr(mstr, index+1, size, q, a, b)
mstr[index] = b
allstr(mstr, index+1, size, q, a, b)
mstr[index] = q // <--- add this
}
• Все идентификаторы имеют интервал типа.
• Тип фруктов не будет влиять на реализацию самого Списка. Это будет только использоваться клиентом списка, как внешний метод, и т.д.
Учитывая эти два факта, я не обеспокоился бы дженериками. Я поместил бы нормальное свойство на FruitList для указания, какой тип фруктов это.
Используйте комбинацию:
public class AppleList : FruitList<Apple> { ... }
public class OrangeList : FruitList<Orange> { ... }
public class LemonList : FruitList<Lemon> { ... }
Поместите общую логику в основной класс списка:
public class FruitList<T> : List<T>
where T : IFruit
{ ... }
Снова используйте классы универсального набора и разделите их на подклассы, только если Вы добавляете дополнительную функциональность. Сохраните свою реализацию подкласса универсальной, если Вы можете. Это - наименее сложная реализация.
Намного легче вести 1 универсальный список, чем 3 неуниверсальных версии. Если Вам действительно нравится название AppleList, можно всегда использовать прием использования для именования универсального списка
using AppleList=Fruit.FruitList<Fruit.Apple>
При использовании дженериков есть ли цель создать тип FruitList? Вы могли просто использовать Список?
Не будет большой разницы в производительности, таким образом, я скажу, почему создают три различных класса, когда можно было бы сделать то же точно вещь? Используйте универсальное решение.
Используйте Универсальный список, никакой смысл в упаковке в ящики 3 списков, и всегда хорошо сохранить уровень абстракции. (IFruit был бы хорошим интерфейсом).
Необходимо принять YAGNI, если Вам не нужен он. Поэтому, если Вам не нужен antyhing больше, чем Вы входите в Список, затем просто List<T>
. Если по некоторым причинам необходимо переопределить Список, то создайте
FruitList<T> : List<T> where T : Fruit
Если Ваши списки отличаются и больше не являются полиморфными, то рассматривают реализацию Ваших пользовательских списков:
AppleList
OrangeList
LemonList
Попробуйте настолько же лучше всего, Вы можете, однако, для хранения иерархии наследования максимально плоской, чтобы не сверхусложнять решение.