Учитывая следующий код:Абстрактный базовый класс или интерфейс? Ни кажется правильным
using System.Collections.Generic;
static class Program {
static void Main() {
bar Bar = new bar();
baz Baz = new baz();
System.Console.WriteLine(
"We have {0} bars, rejoice!", bar.Cache.Count);
}
}
public abstract class foo {
public static List<foo> Cache = new List<foo>();
}
public class bar : foo {
public bar() { Cache.Add(this); }
}
public class baz : foo {
public baz() { Cache.Add(this); }
}
Вы получаете (несколько ожидаемый) выход «У нас есть 2 бара, радуйтесь!».
Это потрясающе, теперь у нас есть в два раза больше мест для пива (по-видимому), но я действительно хочу, чтобы каждый класс имел свой собственный кеш. Причина, по которой я не хочу просто реализовывать этот кеш в подклассе, - это то, что у меня также есть некоторые методы в моем абстрактном классе, которые должны быть в состоянии работать в кеше (а именно, итерации по всем им). Есть ли способ сделать это? Я рассмотрел использование интерфейса для foo
, но интерфейс не позволяет статическим членам быть определенными как часть интерфейса.
Хорошо, что у нас есть функция «загрузить новые ответы». Я собирался опубликовать это. – moffdub
ICache является интерфейсом к типу общего кэша? На самом деле, вы правы, мне нравится это лучше, хотя ответ thinkcube был ближе к тому, что я изначально искал. Это еще одна работа над дизайном для меня сейчас, хотя:) –
Я не согласен, что это лучше. Теперь каждый подкласс должен беспокоиться о предоставлении собственного синглтона. Больше возможностей для дублирования кода. Вместо этого вы все равно можете использовать generics для получения одного класса singleton и выставлять его один раз с помощью GetCache(), но каждый подкласс не вынужден его реализовать. –