Родитель в Плагинах
От: godwizard Россия  
Дата: 19.12.02 12:34
Оценка:
Как в C# при написании интерфейса для плагина описать своиства или методы для доступа к родительским объектам?
Т.е. у меня есть некое ядро, в котором есть объекты или функции и я хочу в плагинах ими пользоваться.
Best regards
Re: Родитель в Плагинах
От: TSS Россия http://www.sdl.ru
Дата: 19.12.02 12:40
Оценка:
Здравствуйте, godwizard, Вы писали:

G>Как в C# при написании интерфейса для плагина описать своиства или методы для доступа к родительским объектам?

G>Т.е. у меня есть некое ядро, в котором есть объекты или функции и я хочу в плагинах ими пользоваться.

В C++ есть __super keyword. У C# этого нет... =(
Как вариант можно передавать указатель на родителя при инициализации плагина.
Signed, [TSS] /SDL/
Re[2]: Родитель в Плагинах
От: godwizard Россия  
Дата: 19.12.02 12:50
Оценка:
Здравствуйте, TSS, Вы писали:

TSS>Здравствуйте, godwizard, Вы писали:


G>>Как в C# при написании интерфейса для плагина описать своиства или методы для доступа к родительским объектам?

G>>Т.е. у меня есть некое ядро, в котором есть объекты или функции и я хочу в плагинах ими пользоваться.

TSS>В C++ есть __super keyword. У C# этого нет... =(

TSS>Как вариант можно передавать указатель на родителя при инициализации плагина.

Это типа methodeName(Parent prnt);? Или как в интерфейсе указатель на родителя передать?
Best regards
Re: Родитель в Плагинах
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.12.02 12:53
Оценка:
Здравствуйте, godwizard, Вы писали:

G>Как в C# при написании интерфейса для плагина описать своиства или методы для доступа к родительским объектам?


Ну ничего не понял. Кто такие интерфейсы и при чем тут плагины?

G>Т.е. у меня есть некое ядро, в котором есть объекты или функции и я хочу в плагинах ими пользоваться.


Ну так пользуйся.
... << RSDN@Home 1.0 beta 3 (developer build)>>
AVK Blog
Re[2]: Родитель в Плагинах
От: godwizard Россия  
Дата: 19.12.02 12:59
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, godwizard, Вы писали:


G>>Как в C# при написании интерфейса для плагина описать своиства или методы для доступа к родительским объектам?


AVK>Ну ничего не понял. Кто такие интерфейсы и при чем тут плагины?


G>>Т.е. у меня есть некое ядро, в котором есть объекты или функции и я хочу в плагинах ими пользоваться.


AVK>Ну так пользуйся.


Я тут примерчик по плагинам прочитал (RSDN Magasine #1) там написано, что можно написать интерфейс для плагина, потом писать плагины, имплементируя интерфейс. Я так и начал делать. Но у меня в основной программе у меня есть объекты, котрые хочется использовать в плагинах.
Best regards
Re[3]: Родитель в Плагинах
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.12.02 13:07
Оценка:
Здравствуйте, godwizard, Вы писали:

G>Я тут примерчик по плагинам прочитал (RSDN Magasine #1)


По моему я писал.

G> там написано, что можно написать интерфейс для плагина, потом писать плагины, имплементируя интерфейс.


Ну да.

G>Я так и начал делать. Но у меня в основной программе у меня есть объекты, котрые хочется использовать в плагинах.


Вынеси эти объекты (или их интерфейсы) в отдельную сборку и сделай на них референс. Теоретически можно сделать референс прямо на ехе-шник, но студия на это ругается.
... << RSDN@Home 1.0 beta 3 (developer build)>>
AVK Blog
Re[4]: Родитель в Плагинах
От: godwizard Россия  
Дата: 19.12.02 13:18
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, godwizard, Вы писали:


G>>Я тут примерчик по плагинам прочитал (RSDN Magasine #1)


AVK>По моему я писал.


G>> там написано, что можно написать интерфейс для плагина, потом писать плагины, имплементируя интерфейс.


AVK>Ну да.


G>>Я так и начал делать. Но у меня в основной программе у меня есть объекты, котрые хочется использовать в плагинах.


AVK>Вынеси эти объекты (или их интерфейсы) в отдельную сборку и сделай на них референс. Теоретически можно сделать референс прямо на ехе-шник, но студия на это ругается.


А как ты плагины создаешь? Я имею ввиду какой тип Проекта ты выбираешь, Class Library?
Best regards
Re[5]: Родитель в Плагинах
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.12.02 13:31
Оценка:
Здравствуйте, godwizard, Вы писали:

G>А как ты плагины создаешь? Я имею ввиду какой тип Проекта ты выбираешь, Class Library?


Конечно
... << RSDN@Home 1.0 beta 3 (developer build)>>
AVK Blog
Re[6]: Родитель в Плагинах
От: godwizard Россия  
Дата: 19.12.02 13:45
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, godwizard, Вы писали:


G>>А как ты плагины создаешь? Я имею ввиду какой тип Проекта ты выбираешь, Class Library?


AVK>Конечно


AVK>


Вот еще тогда такой вопрос. Я плагины хочу перебирать добавлять в меню. У меня MDI приложение и плагины — это дочерние окна. Я в интерфейсе указываю метод выбора пункта меню и в плагине я должен указать MdiParent. Как мне родителя передать? Exe-шник основной референсить?
Best regards
Re[7]: Родитель в Плагинах
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.12.02 14:05
Оценка:
Здравствуйте, godwizard, Вы писали:

G>Вот еще тогда такой вопрос. Я плагины хочу перебирать добавлять в меню. У меня MDI приложение и плагины — это дочерние окна. Я в интерфейсе указываю метод выбора пункта меню и в плагине я должен указать MdiParent. Как мне родителя передать? Exe-шник основной референсить?


Придумать для родителя интерфейс и вынести в другую сборку
... << RSDN@Home 1.0 beta 3 (developer build)>>
AVK Blog
Re[8]: Родитель в Плагинах
От: godwizard Россия  
Дата: 19.12.02 14:15
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, godwizard, Вы писали:


G>>Вот еще тогда такой вопрос. Я плагины хочу перебирать добавлять в меню. У меня MDI приложение и плагины — это дочерние окна. Я в интерфейсе указываю метод выбора пункта меню и в плагине я должен указать MdiParent. Как мне родителя передать? Exe-шник основной референсить?


AVK>Придумать для родителя интерфейс и вынести в другую сборку


Я тут проблемку эту решил, но вылезла новая : делаю все по примеру, описанному в журнале, но во-первых,
if(typeof(IPluginModule).IsAssignableFrom(t))
почему то игнорирует мой тип, во-вторых, когда я его закоментировал, он мне стал ругаться на
IPluginModule pm = (IPluginModule)asm.CreateInstance(t.FullName);
Выдает:


An unhandled exception of type 'System.MissingMethodException' occurred in mscorlib.dll

Additional information: Constructor on type Proman.IPluginModule not found.
Best regards
Re[9]: Родитель в Плагинах
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.12.02 15:37
Оценка:
Здравствуйте, godwizard, Вы писали:

G>Я тут проблемку эту решил, но вылезла новая : делаю все по примеру, описанному в журнале, но во-первых,

G>
if(typeof(IPluginModule).IsAssignableFrom(t))
почему то игнорирует мой тип, во-вторых, когда я его закоментировал, он мне стал ругаться на
IPluginModule pm = (IPluginModule)asm.CreateInstance(t.FullName);
Выдает:


G>

G>An unhandled exception of type 'System.MissingMethodException' occurred in mscorlib.dll

G>Additional information: Constructor on type Proman.IPluginModule not found.

G>


Видимо у тебя нет конструктора без параметров. А MissingMethodException обычно вылазит если сборки не перекомпилировать. Сделай в студии Rebuild solution.
... << RSDN@Home 1.0 beta 3 (np: тихо) >>
AVK Blog
Re[10]: Родитель в Плагинах
От: godwizard Россия  
Дата: 19.12.02 15:47
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, godwizard, Вы писали:


G>>Я тут проблемку эту решил, но вылезла новая : делаю все по примеру, описанному в журнале, но во-первых,

G>>
if(typeof(IPluginModule).IsAssignableFrom(t))
почему то игнорирует мой тип, во-вторых, когда я его закоментировал, он мне стал ругаться на
IPluginModule pm = (IPluginModule)asm.CreateInstance(t.FullName);
Выдает:


G>>

G>>An unhandled exception of type 'System.MissingMethodException' occurred in mscorlib.dll

G>>Additional information: Constructor on type Proman.IPluginModule not found.

G>>


AVK>Видимо у тебя нет конструктора без параметров. А MissingMethodException обычно вылазит если сборки не перекомпилировать. Сделай в студии Rebuild solution.


Есть конструктор без параметров. Может в плагине чего прописать?

public interface IPluginModule
{
        string getName();
    string getCaption();
    string getDescription();
    void MenuEventSelected(object sender, System.EventArgs e);
    void setParent(System.Windows.Forms.Form fParent);
}
Best regards
Re[11]: Родитель в Плагинах
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 19.12.02 16:01
Оценка:
Здравствуйте, godwizard, Вы писали:

G>Есть конструктор без параметров. Может в плагине чего прописать?


А конструктор объявлен как public?
... << RSDN@Home 1.0 beta 3 >>
Re[12]: Родитель в Плагинах
От: godwizard Россия  
Дата: 19.12.02 16:10
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>Здравствуйте, godwizard, Вы писали:


G>>Есть конструктор без параметров. Может в плагине чего прописать?


DG>А конструктор объявлен как public?


public class fProExplorer : Form, IPluginModule
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private Container components = null;

        public fProExplorer()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }
....
Best regards
Re[10]: Родитель в Плагинах
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 19.12.02 16:18
Оценка:
Здравствуйте, AndrewVK, Вы писали:

IPluginModule pm = (IPluginModule)asm.CreateInstance(t.FullName);


Во время ошибки t.FullName == "Proman.IPluginModule", Так?

Тогда все понятно: ты пытаешь создать объект типа интерфейс...

Интерфейс надо пропускать.
... << RSDN@Home 1.0 beta 3 >>
Re[11]: Родитель в Плагинах
От: godwizard Россия  
Дата: 20.12.02 05:52
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>Здравствуйте, AndrewVK, Вы писали:


DG>
IPluginModule pm = (IPluginModule)asm.CreateInstance(t.FullName);


DG>Во время ошибки t.FullName == "Proman.IPluginModule", Так?


DG>Тогда все понятно: ты пытаешь создать объект типа интерфейс...


DG>Интерфейс надо пропускать.


DG>


В смысле пропускать?
Best regards
Re[12]: Родитель в Плагинах
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 20.12.02 09:40
Оценка:
Здравствуйте, godwizard, Вы писали:

G>В смысле пропускать?


Такое ощущение, что ты перебираешь типы из своей assembly, а не из той где у тебя лежит plugin.

При этом ты при перебирании находишь интерфейс IPluginModule и пытаешь создать объект с типом IPluginModule. Ясно что у тебя ничего не получается.

ps
Если у тебя все-таки просто лежат interface и сам plugin в одной ассембли (Да и вообще на будущее), то просто сделай так:

if(typeof(IPluginModule).IsAssignableFrom(t) && !t.IsAbstract)
  IPluginModule pm = (IPluginModule)asm.CreateInstance(t.FullName);
... << RSDN@Home 1.0 beta 3 >>
Re[13]: Родитель в Плагинах
От: godwizard Россия  
Дата: 20.12.02 11:13
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>Здравствуйте, godwizard, Вы писали:


G>>В смысле пропускать?


DG>Такое ощущение, что ты перебираешь типы из своей assembly, а не из той где у тебя лежит plugin.


DG>При этом ты при перебирании находишь интерфейс IPluginModule и пытаешь создать объект с типом IPluginModule. Ясно что у тебя ничего не получается.


DG>ps

DG> Если у тебя все-таки просто лежат interface и сам plugin в одной ассембли (Да и вообще на будущее), то просто сделай так:

DG>
DG>if(typeof(IPluginModule).IsAssignableFrom(t) && !t.IsAbstract)
DG>  IPluginModule pm = (IPluginModule)asm.CreateInstance(t.FullName); 
DG>


DG>


Сделал все как ты написал, все равно где идет проверка
if(typeof(IPluginModule).IsAssignableFrom(t) && !t.IsAbstract)

и в дебаге вижу что t = Proman.IPluginModule, почему то игнорируется
Best regards
Re[14]: Родитель в Плагинах
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 20.12.02 11:20
Оценка:
Здравствуйте, godwizard, Вы писали:

G>Сделал все как ты написал, все равно где идет проверка

G>
G>if(typeof(IPluginModule).IsAssignableFrom(t) && !t.IsAbstract)
G>

G>и в дебаге вижу что t = Proman.IPluginModule, почему то игнорируется

Интерфейс как раз и должен игнорироваться, должны находится только классы, которые реализовывают этот интерфейс.

Почему у тебя не находятся классы? — Имхо, потому что ты ищешь их не в той сборке.
... << RSDN@Home 1.0 beta 3 >>
Re[15]: Родитель в Плагинах
От: godwizard Россия  
Дата: 20.12.02 11:33
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>Здравствуйте, godwizard, Вы писали:


G>>Сделал все как ты написал, все равно где идет проверка

G>>
G>>if(typeof(IPluginModule).IsAssignableFrom(t) && !t.IsAbstract)
G>>

G>>и в дебаге вижу что t = Proman.IPluginModule, почему то игнорируется

DG>Интерфейс как раз и должен игнорироваться, должны находится только классы, которые реализовывают этот интерфейс.


DG>Почему у тебя не находятся классы? — Имхо, потому что ты ищешь их не в той сборке.


Дык я просто папку с длл-ками сканирую и подключаю в цикле. При чем тут сборка?
Best regards
Re[16]: Родитель в Плагинах
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 20.12.02 11:50
Оценка:
G>Дык я просто папку с длл-ками сканирую и подключаю в цикле. При чем тут сборка?

папка-то правильная?
... << RSDN@Home 1.0 beta 3 >>
Re[17]: Родитель в Плагинах
От: godwizard Россия  
Дата: 20.12.02 12:01
Оценка:
Здравствуйте, DarkGray, Вы писали:

G>>Дык я просто папку с длл-ками сканирую и подключаю в цикле. При чем тут сборка?


DG>папка-то правильная?


DG>


да. и длл-ку находит, т.е. я все шаги в дебаге просматриваю. и когда доходит до создания объекта, тут то все накрывается. Ругается, что конструктор на IPluginModule не найден В интерфесе же не надо никаких конструкторов прописывать.
Best regards
Re[18]: Родитель в Плагинах
От: MaxMP Россия  
Дата: 20.12.02 13:29
Оценка:
Здравствуйте, godwizard, Вы писали:

G>Здравствуйте, DarkGray, Вы писали:


G>>>Дык я просто папку с длл-ками сканирую и подключаю в цикле. При чем тут сборка?


DG>>папка-то правильная?


DG>>


G>да. и длл-ку находит, т.е. я все шаги в дебаге просматриваю. и когда доходит до создания объекта, тут то все накрывается. Ругается, что конструктор на IPluginModule не найден В интерфесе же не надо никаких конструкторов прописывать.


А зачем ты интерфес пытаешься создать?
Re[19]: Родитель в Плагинах
От: godwizard Россия  
Дата: 20.12.02 13:35
Оценка:
Здравствуйте, MaxMP, Вы писали:

MMP>Здравствуйте, godwizard, Вы писали:


G>>Здравствуйте, DarkGray, Вы писали:


G>>>>Дык я просто папку с длл-ками сканирую и подключаю в цикле. При чем тут сборка?


DG>>>папка-то правильная?


DG>>>


G>>да. и длл-ку находит, т.е. я все шаги в дебаге просматриваю. и когда доходит до создания объекта, тут то все накрывается. Ругается, что конструктор на IPluginModule не найден В интерфесе же не надо никаких конструкторов прописывать.


MMP>А зачем ты интерфес пытаешься создать?


Есть другое предложение?
... << RSDN@Home 1.0 beta 4 >>
Best regards
Re[20]: Родитель в Плагинах
От: kreek  
Дата: 20.12.02 13:39
Оценка:
Здравствуйте, godwizard, Вы писали:

MMP>>А зачем ты интерфес пытаешься создать?


G>Есть другое предложение?


Экземпляр интерфейса не создается, через него можно подергать объект за заранее известные методы, а создаются экземпляры классов, которые реализуют этот интерфейс
... << RSDN@Home 1.0 beta 3 >>
Re[21]: Родитель в Плагинах
От: godwizard Россия  
Дата: 20.12.02 13:50
Оценка:
Здравствуйте, kreek, Вы писали:

K>Здравствуйте, godwizard, Вы писали:


MMP>>>А зачем ты интерфес пытаешься создать?


G>>Есть другое предложение?


K>Экземпляр интерфейса не создается, через него можно подергать объект за заранее известные методы, а создаются экземпляры классов, которые реализуют этот интерфейс


Может я чего то недопонимаю? Я создал интерфейс, создал класс, имплементирующий данный интерфейс, скомпилировл длл, далее в программе загружаю длл и хочу создать объект этого класса: MyInterface myObject = (MyInterface)asm.CreateInstance(t.FullName);
Или чего то не так?
... << RSDN@Home 1.0 beta 4 >>
Best regards
Re[22]: Родитель в Плагинах
От: kreek  
Дата: 20.12.02 13:57
Оценка:
Здравствуйте, godwizard, Вы писали:

G>Может я чего то недопонимаю? Я создал интерфейс, создал класс, имплементирующий данный интерфейс, скомпилировл длл, далее в программе загружаю длл и хочу создать объект этого класса: MyInterface myObject = (MyInterface)asm.CreateInstance(t.FullName);

G>Или чего то не так?

Я не про конкретную задачу, с которой у тебя проблема. А что вообще возвращает asm.CreateInstance(t.FullName)
... << RSDN@Home 1.0 beta 3 >>
Re[23]: Родитель в Плагинах
От: godwizard Россия  
Дата: 20.12.02 14:11
Оценка:
Здравствуйте, kreek, Вы писали:

K>Здравствуйте, godwizard, Вы писали:


G>>Может я чего то недопонимаю? Я создал интерфейс, создал класс, имплементирующий данный интерфейс, скомпилировл длл, далее в программе загружаю длл и хочу создать объект этого класса: MyInterface myObject = (MyInterface)asm.CreateInstance(t.FullName);

G>>Или чего то не так?

K>Я не про конкретную задачу, с которой у тебя проблема. А что вообще возвращает asm.CreateInstance(t.FullName)


Попробовал даже так написать
Object pm = asm.CreateInstance(t.FullName);


выдала вот такой Exception:
[c#]
An unhandled exception of type 'System.MissingMethodException' occurred in mscorlib.dll

Additional information: Constructor on type Proman.IPluginModule not found.
[c#]
... << RSDN@Home 1.0 beta 4 >>
Best regards
Re[24]: Родитель в Плагинах
От: kreek  
Дата: 20.12.02 14:25
Оценка:
Здравствуйте, godwizard, Вы писали:

G>Попробовал даже так написать
Object pm = asm.CreateInstance(t.FullName);


G>выдала вот такой Exception:

G>[c#]
G>An unhandled exception of type 'System.MissingMethodException' occurred in mscorlib.dll

G>Additional information: Constructor on type Proman.IPluginModule not found.

G>[c#]

У тебя скорее всего t.FullName == Proman.IPluginModule, а надо указать класс, который имплементирует этот интерфейс.
... << RSDN@Home 1.0 beta 3 >>
Re[25]: Родитель в Плагинах
От: godwizard Россия  
Дата: 20.12.02 14:40
Оценка:
Здравствуйте, kreek, Вы писали:

K>Здравствуйте, godwizard, Вы писали:


G>>Попробовал даже так написать
Object pm = asm.CreateInstance(t.FullName);


G>>выдала вот такой Exception:

G>>[c#]
G>>An unhandled exception of type 'System.MissingMethodException' occurred in mscorlib.dll

G>>Additional information: Constructor on type Proman.IPluginModule not found.

G>>[c#]

K>У тебя скорее всего t.FullName == Proman.IPluginModule, а надо указать класс, который имплементирует этот интерфейс.


Извини, я просто не знаю как это писать, если подскажешь, буду благодарен.
... << RSDN@Home 1.0 beta 4 >>
Best regards
Re[26]: Родитель в Плагинах
От: kreek  
Дата: 20.12.02 14:45
Оценка:
Здравствуйте, godwizard, Вы писали:

G>Извини, я просто не знаю как это писать, если подскажешь, буду благодарен.


Кидай сырцы.
... << RSDN@Home 1.0 beta 3 >>
Re[27]: Родитель в Плагинах
От: godwizard Россия  
Дата: 20.12.02 14:51
Оценка:
Здравствуйте, kreek, Вы писали:

K>Здравствуйте, godwizard, Вы писали:


G>>Извини, я просто не знаю как это писать, если подскажешь, буду благодарен.


K>Кидай сырцы.


я тебе на kreek@inbox.ru кинул
... << RSDN@Home 1.0 beta 4 >>
Best regards
Re[26]: Родитель в Плагинах
От: MaxMP Россия  
Дата: 20.12.02 16:16
Оценка:
K>>У тебя скорее всего t.FullName == Proman.IPluginModule, а надо указать класс, который имплементирует этот интерфейс.

G>Извини, я просто не знаю как это писать, если подскажешь, буду благодарен.


Откуда-то ты это t же берешь? И это t у тебя есть тип интерфейса, а должен быть тип класса, рефлизующего интерфейс!
Re[28]: Родитель в Плагинах
От: kreek  
Дата: 20.12.02 17:13
Оценка:
Так ведь у тебя в сборке ProExplorer.dll объевлен интерфейс IPluginModule и класс имплементирующий его fProExplorer, а клиент имеет свой интерфейс IPluginModule, т.е. получается, что у тебя 2 интерфейса IPluginModule, но fProExplorer реализует тот интерфейс, который объевлен в сборке плагина, поэтому и невозможно сделать приведение типа на клиенте.
Я не знаю откуда ты брал пример, но делать надо не так, т.е. общий интерфейс выносить в отдельную сборку и цеплять ее в сборку плагина и к клиенту, в сборке плагина реализовывать в классах, а на клиенте приводить к этому типу, тогда не будет проблем Invalid cast exception.
Удачи.
... << RSDN@Home 1.0 beta 3 >>
Re[9]: Родитель в Плагинах
От: Dr_Fox  
Дата: 12.04.04 07:05
Оценка:
Здравствуйте, godwizard, Вы писали:


G>>>Вот еще тогда такой вопрос. Я плагины хочу перебирать добавлять в меню. У меня MDI приложение и плагины — это дочерние окна. Я в интерфейсе указываю метод выбора пункта меню и в плагине я должен указать MdiParent. Как мне родителя передать? Exe-шник основной референсить?


G>Я тут проблемку эту решил...


Извините за вопрос на вопрос, но все-таки, как вы решили эту проблемку? Заранее спасибо за помощь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.