Язык программирования C# отвечает трём основным принципам объектно-ориентированного программирования (ООП):
- Инкапсуляция - скрывает детали внутренней реализации объектов и предохраняет целостность данных;
Наследование - позволяет строить новые определения классов на основе существующих;
Полиморфизм - позволяет трактовать связанные объекты сходным образом;
...
namespace ElementVirtual
{
[About(version = "1.0", author = "Developer Name", mail = "developer@mail.net")]
[ToolboxBitmap(typeof(Derived), "Resources.DerivedClass.ico")]
[Install("_base", "A simple example of inheritance", "Core")]
[Type("Derived", "An example of inheritance", tab = "Core")]
public class Derived : Example
{
public Derived(PackElement pe, SDK sdk, int x, int y) : base(pe, sdk, x, y) { }
}
...
Ранее в теме обещал показать неочевидный, но быстрый способ добавления иконки в ресурсы сборки. Для этого надо предварительно подготовленный файл иконки поместить в папку ресурсов проекта. В нашем случае это будет папка C:\Projects\MyElementCore\MyElementCore\Resources. Добавляем ещё одну иконку DerivedClass.ico в ресурсы сборки, используя «быстрый» способ:


Вот так будет выглядеть код элементов после вставки:
Новый элемент надо поместить на панель инструментов, чтобы можно было его вставлять в схемы. Сделать это можно ещё раз открыв файл сборки в конструкторе через меню Open или набросить его на окно программы. Для проверки работы «нового» элемента в предыдущем примере заменяем наш элемент Example элементом Derived:


Теперь надо сделать наследование для скрипта проекта Windows Forms. Для этого надо добавить в ресурсы сборки ещё один скрипт с именем wfDerived.cs и следующим содержанием:
//css_pc wfPrecompiler.cs;
public class Derived : Example
{
public override bool init(object entry)
{
Debug.WriteLine("{0}.init()".fString(this.codename));
return base.init(this);
}
}
Также необходимо дополнить метод инициализации элемента Example следующим кодом:
public override void init(int flag = 0)
{
base.init(flag);
...
string context = Path.Combine(this.parent.getMSDK().pack.pathCode(), "wfExample.cs");
if (File.Exists(context))
{
this.linkedPath.Add(context);
return;
}
string result = Helpers.compileScript(Properties.Resources.wfExample);
if (Helpers.validatePath(ref result))
this.linkedPath.Add(result);
else if (!result.isEmpty())
Debug.WriteLine(result, "!");
}
Это добавление компилирует скрипт проекта Windows Forms в сборку на диске и сохраняет путь к ней в свойствах элемента. Вот так будет выглядеть код элементов после вставки:
Проверим элемент в работе:


Мы получили функциональную копию нашего элемента Example. Конечно мы можем определить для элемента Derived свою собственную функциональность, которая будет расширением базовой, наследованной из элемента Example. Можете скачать полный код проекта: MyElementCore.zip