До прочтения данного произведения я относился скептически к подобным жанрам, особенно 18+. Но я был действительно приятно удивлён и две недели не мог оторваться от чтения. Наконец дочитав, решил написать отзыв. Чем больше думаю об этом, тем труднее выбрать точную оценку. Книга мне безумно понравилась, и я без угрызения совести могу сказать, что обязательно её перечитаю в будущем. Однако некоторые моменты испортили общее
подробнее ...
впечатление.
Первые две книги, даже третья, развивались хорошо и не спеша, держа интригу. Но потом что-то случилось: автор как будто пытался закончить как можно скорее, игнорируя многие моменты, что привело к множеству вопросов и недопониманий. Как Аксель выжил? Почему отступил Хондар и что с ним теперь? Как обстоят дела в Империи после победы, ведь один из главных членов Тайной Стражи оказался предателем? Что мешало Сикху сразу избавиться от Акселя, как только тот лишился части души? Что двигало Августом, что такого произошло между им и владыкой Грехов? Второстепенных вопросов у меня ещё больше. Несмотря на крутой сюжет и мир, многое написано словно на скорую руку и слишком скомкано.
Например, в Эльфийском лесу явно были недовольны браком, и однажды даже было покушение на ГГ. Почему попытки не продолжались, ведь Аксель действительно приносил много проблем эльфам, особенно после смерти их бога? Или встреча в нижнем мире с богом демонов, который сказал, что их встреча не последняя. Но в конце Аксель становится смертным и лишается своей силы, и они уже точно не встретятся. Почему были выкинуты Лилиш и Шальда? Если первую убили, то вторая жила в поместье и была действительно полезной, но что с ней по итогу случилось, не ясно.
Короче говоря, слишком много недосказанностей. Многие интересные арки начались, но такое чувство, что автору становилось лень их продолжать до логического конца. Самый яркий пример — бизнес Акселя в лице корабельной верфи. Он встретился в темнице с отцом одного из своих гвардейцев, поговорили о контракте, и на этом всё закончилось. А дальше что?
Теперь к другим вещам, которые подпортили впечатление. Эмоции всех девушек, боевые заклинания, эротика — почему всё это одинаковое? Каждая девушка "прикусывает губу", "мурлыкает". Эти слова повторяются слишком часто. Заклинания тоже разочаровали, они не менялись и застыли на уровне первого года обучения в академии. Аксель ничего не умеет, кроме воздушных стен и чёрных сфер. А про бедняжку Тирру вообще молчу: всё, что она могла — это создавать огненные шары. Где разнообразие? С эротикой всё точно так же. Местами она была в тему и действительно добавляла шарма, но иногда хотелось пропустить эти сцены, потому что они вставлялись в неподходящие моменты и были абсолютно одинаковыми.
Почему Акселя почти всегда окружают только девушки? И большая часть его гвардии — тоже девушки. Спасибо, что хоть Корал был, но его арка тоже не до конца раскрыта. Можно было бы много чего увлекательного с ним сделать, ведь он получился интересным персонажем.
Я мог бы написать ещё много чего, но боюсь, что отзыв выйдет слишком длинным. Единственное, что хочется добавить в конце, это про суккубу Тирру. В начале она была просто прелесть, умная, сильная, ценная единица в отряде. Но под конец она стала беспомощной обузой и вызывала раздражение, ведя себя как ребёнок. В начале за ней такого не наблюдалось, что обидно, ведь как персонаж она мне больше всех нравилась.
В общем, автору есть куда расти и стремиться. Потенциал хороший, и надеюсь, что когда-то будет продолжение этой увлекательной истории, которое расставит все точки над "и".
Часть четвертую я слушал необычайно долго (по сравнению с предыдущей) и вроде бы уже точно определился в части необходимости «взять перерыв», однако... все же с успехом дослушал ее до конца. И не то что бы «все надоело вконец», просто слегка назрела необходимость «смены жанра», да а тов.Родин все по прежнему курсант и... вроде (несмотря ни на что) ничего (в плане локации происходящего) совсем не меняется...
Как и в частях предыдущих —
подробнее ...
разрыв (конец части третьей и начало части четверной) был посвящен очередному ЧП и (разумеется, кто бы мог подумать)) очередному конфликту с новым начальственным мразматиком в погонах)). Далее еще один (почти уже стандартный) конфликт на пустом месте (с кучей гопников) и дикая куча проблем (по прошествии))
Удивила разве что встреча с «перевоспитавшейся мразью» (в роли сантехника) и вся комичность ситуации «а ля любовник в ванной»)) В остальном же вроде все как всегда, но... ближе к середине все же наступили «долгожданные госы» и выпуск из летного училища... Далее долгие взаимные уговоры (нашего героя) выбрать «место потеплее», но он (разумеется) воспрининял все буквально и решил «сунуться в самое пекло».
Данный выбор хоть и бы сделан «до трагедии» (не буду спойлерить), но (ради справедливости стоит сказать, что) приходится весьма к месту... Новая «локация», новые знакомые (включая начальство) и куча работы (вольно, невольно помогающяя «забыть утрату»). Ну «и на закуску» очередная (почти идиотская) ситуация в которой сам же ГГ (хоть и косвенно, но) виноват (и опять нажравшись с трудом пытается вспомнить происходящее). А неспособность все внятно (и резко) проъяснить сразу — мгновенно помогает получить (на новом месте службы) репутацию «мразоты» и лишь некий намек (на новый роман) несколько скрашивает суровые будни «новоиспеченного лейтенанта».
В конце данной части (как ни странно) никакого происшествия все же нет... поскольку автор (на этот раз) все же решил поделиться некой «весьма радостной» (но весьма ожидаемой) вестью (о передислокации полка, в самое «пекло мира»)).
// Только для чтения.
public virtual string Name {
get {
return name;
}
}
// Свойство Level.
// Только для чтения.
public virtual string Level {
get {
return level;
}
}
// Свойство Reviewed.
// Чтение / Запись.
public virtual bool Reviewed {
get {
return reviewed;
}
set {
reviewed = value;
}
}
}
MC++
#using <mscorlib.dll>
[AttributeUsage(AttributeTargets::All)]
public __gc class DeveloperAttribute : public System::Attribute {
private:
// Закрытые поля.
String* name;
String* level;
Boolean reviewed;
public:
// Конструктор принимает два обязательных параметра: имя и уровень.
DeveloperAttribute(String* name, String* level) {
this->name = name;
this->level = level;
this->reviewed = false;
}
// Свойство Name.
// Только для чтения.
__property virtual String* get_Name() { return name; }
// Свойство Level.
// Только для чтения.
__property virtual String* get_Level() { return level; }
// Свойство Reviewed.
// Чтение / Запись.
__property virtual Boolean get_Reviewed() { return reviewed; }
__property virtual void set_Reviewed(Boolean value) { reviewed = value; }
}
Visual Basic.NET
Public Class <AttributeUsage(AttributeTargets.All)> DeveloperAttribute
Inherits System.Attribute
' Закрытые поля.
Private name As String
Private level As String
Private reviewed As Boolean
' Конструктор принимает два обязательных параметра: имя и уровень.
Public Sub New(name As String, level As String)
Me.name = name
Me.level = level
Me.reviewed = False
End Sub
' Свойство Name.
' Только для чтения.
Public Overridable ReadOnly Property Name() As String
Get
Return name
End Get
End Property
' Свойство Level.
' Только для чтения.
Public Overridable ReadOnly Property Level() As String
Get
Return level
End Get
End Property
' Свойство Reviewed.
' Чтение / Запись.
Public Overridable Property Reviewed() As Boolean
Get
Return reviewed
End Get
Set
reviewed = value
End Set
End Property
End Class
Применять этот атрибут можно, используя как полное имя DeveloperAttribute, так и сокращенное – Developer:
C#
[Developer("Иван Семенов", "1")]
[Developer("Иван Семенов", "1", Reviewed = true)]
MC++
[Developer(S"Иван Семенов", S"1")]
[Developer(S"Иван Семенов", S"1", Reviewed = true)]
Visual Basic.NET
<Developer("Иван Семенов", "1")>
<Developer("Иван Семенов", "1", Reviewed := True)>
В первом примере показано применение атрибута с одним обязательным параметром, а во втором – с обоими типами параметров.
Доступ к информации, хранящейся в атрибутах
Теперь настало время рассмотреть механизм получения атрибутов, ведь мало научиться сохранять свои атрибуты в метаданных, важно еще и уметь получать и использовать их. К счастью, получение пользовательского атрибута – простая задача. Сначала объявляется переменная с типом атрибута, который нужно получить, затем она инициализируется с помощью вызова метода Attribute.GetCustomAttribute. Все, теперь можно использовать любые доступные свойства атрибута.
Получение одиночного атрибута
В следующем примере атрибут DeveloperAttribute (рассмотренный выше) применяется к классу MainApp в целом. Метод GetAttribute использует Attribyte.GetCustomAttribute для получения состояния атрибута DeveloperAttribute перед тем, как вывести информацию на консоль.
C#
using System;
[Developer("Иван Семенов", "42", Reviewed = true)]
class MainApp {
public static void Main() {
// Вызвать функцию получения и отображения атрибута.
GetAttribute(typeof(MainApp));
}
public static void GetAttribute(Type t) {
// Получить атрибут.
DeveloperAttribute MyAttribute =
(DeveloperAttribute)Attribute.GetCustomAttribute(t, typeof(DeveloperAttribute));
if (MyAttribute == null) {
Console.WriteLine("Атрибут не найден.");
} else {
// Получить поле Имя.
Console.WriteLine("Имя: {0}." , MyAttribute.Name);
// Получить поле Уровень.
Console.WriteLine("Уровень: {0}." , MyAttribute.Level);
// Получить поле Проверено.
Console.WriteLine("Проверено: {0}." , MyAttribute.Reviewed);
}
}
}
MC++
#using <mscorlib.dll> using namespace System;
[Developer(S"Иван Семенов", S"42", Reviewed = true)]
public__gc class MainApp{
public:
static void GetAttribute(Type* t) {
// Получить атрибут.
DeveloperAttribute* MyAttribute =
__try_cast<DeveloperAttribute*>
(Attribute::GetCustomAttribute(t, __typeof(DeveloperAttribute)));
if (MyAttribute == 0)
Console::WriteLine(S"Атрибут не найден.");
else {
// Получить поле Имя.
Console::WriteLine(S"Имя: {0}." , MyAttribute->Name);
// Получить поле Уровень.
Console::WriteLine(S"Уровень: {0}." , MyAttribute->Level);
// Получить поле Проверено.
Console::WriteLine(S"Проверено: {0}." , MyAttribute->Reviewed);
}
}
};
void main() {
// Вызвать функцию получения и отображения атрибута.
MainApp::GetAttribute(__typeof(MainApp));
}
Visual Basic.NET
Imports System
Class <Developer("Иван Семенов", "42", Reviewed := True)> MainApp
Public Shared Sub Main()
' Вызвать функцию получения и отображения атрибута.
GetAttribute(GetType(MainApp))
End Sub
Public Shared Sub GetAttribute(t As Type) ' Получить атрибут.
Dim MyAttribute As DeveloperAttribute = _
CType(Attribute.GetCustomAttribute(t, GetType(DeveloperAttribute)), DeveloperAttribute)
If MyAttribute Is Nothing Then Console.WriteLine("Атрибут не найден.")
Else ' Получить поле Имя.
Console.WriteLine("Имя: {0}.", MyAttribute.Name) ' Получить поле Уровень.
Console.WriteLine("Уровень: {0}.", MyAttribute.Level) ' Получить поле Проверено.
Console.WriteLine("Проверено: {0}.", MyAttribute.Reviewed)
End If
End Sub
End Class
При
Последние комментарии
1 день 2 часов назад
1 день 11 часов назад
1 день 16 часов назад
1 день 18 часов назад
1 день 23 часов назад
1 день 23 часов назад