Абстрактные классы предназначены для использования в качестве базовых классов;они не могут иметь прямых примеров.Вместо этого вы должны получить подклассы, которые предоставляют то, что было (обычно намеренно) опущено в абстрактном базовом классе.
Пример. Предположим, у вас сложное приложение, в которое пользователи могут войти.Различные механизмы аутентификации должны быть применимы, скажем, LDAP, NTLM, вы называете это.Один из способов моделирования «пользователя» или «принципала» в таком контексте состоит в том, чтобы собрать, что является общим для всех этих механизмов, в абстрактный базовый класс и оставить «пробелы» (абстрактные методы), в которые входят реальные реализации.play:
abstract class Authenticator {
protected Dictionary<string,User> userCache;
...
public User LoadUser(string name) {
User user;
if( userCache.TryGet(name, out user) ) return user;
else {
user = LoadFromStore(name);
userCache.Add(name, user);
return user;
}
}
protected abstract User LoadFromStore(string name);
}
Здесь кеширование пользователей является общей проблемой, смоделированной в базовом случае, в то время как фактическое извлечение оставлено для обеспечения подклассом.
Статический класс отличаетсяимеет значение в целом.По сути, это место для хранения ваших служебных функций:
static class StrUtil {
public static string TrimWhitespace(string str) {
...
}
}
Думайте о них как о неком особом пространстве имен, которое может содержать только статические члены.В основном это место для размещения функций.