Я должен расширить приложение, добавив в него больше классов, в качестве своего рода «плагинов».Приложение принимает строковый параметр и пытается создать экземпляр объекта класса с именем, соответствующим этой строке.если это удается, приложение продолжает вызывать различные конкретные функции из этого класса (например, Initialize()
) и сериализовать структуру или класс с именем Data
* внутри.В идеале один такой класс должен выглядеть следующим образом:
public class SomePlugin
{
public abstract event ChangesAppliedDelegate ChangesApplied;
public delegate void ChangesAppliedDelegate();
public Model Data = new Model();
public SomePlugin()
{
Data.Initialized = false;
}
public bool Initialize()
{
Data.Initialized = true;
return true;
}
[Serializable]
public struct Model
{
bool Initialized;
}
}
Согласно настоящему файлу readme, в каждом таком классе ДОЛЖНЫ существовать следующие вещи, потому что фреймворк опирается на них:
- Событие с именем
ChangesApplied
, на которое платформа может подписаться. - Сериализуемый объект с именем
Data
, определение и содержание не имеют значения. - Метод
Initialize()
, который будет вызван один разобъект был создан.
Теперь я пытаюсь заменить этот readme базовым классом, который предположительно «поможет» мне или любому следующему разработчику реализовать эти требования так же ясно, каквозможный.Теперь я застрял в определении модели данных.
Я бы предпочел сделать это частичным и пустым, чтобы оно существовало в базовом классе, и фреймворк мог полагаться на него, в то время как все производные классы могутпри желании можно заполнить его содержимым:
public abstract class Base
{
public abstract Model Data;
public partial struct Model { }
}
public class Derivate : Base
{
public Model Data = new Model();
public bool Initialize()
{
Data.A = 1;
Data.B = "Hello world.";
return true;
}
public partial struct Model
{
int A;
string B;
}
}
Но это дает целый ряд ошибок и предупреждений компилятора (например, то, что Derivate.Model скрывает Base.Model (это не то, что я намеревался), или это модификатор 'abstract' недопустим в полях. , предлагая мне использовать свойства, что в любом случае приводит меня к функциям getter и setters).Как лучше всего реализовать мои идеи?Моя идея чем-то хороша или я просто делаю вещи более сложными, чем они есть?
ОБНОВЛЕНИЕ
Пока этот вопрос приостановлен, я 'Мы пришли к выводу, что интерфейс (в отличие от абстрактного класса) лучше подходит для этой цели с двумя основными недостатками:
- Фреймворковое приложение должно изменить способ доступа к сериализуемым данным.
- Хотя программисту не нужно реализовывать какую-либо структуру или класс,
GetData()
и SetData()
, в частности обобщенный тип возврата GetData()
(object
), подразумевают существование некоторого вида объекта Data,Но поскольку среда больше не работает с данными напрямую, вопрос как и где для хранения данных становится неактуальным (поэтому я использую MyModel
вместо Model
в следующем коде).
Это выглядит следующим образом:
public interface IBase
{
object GetData();
void SetData(object newData);
}
public Derivate : IBase
{
public MyModel Data = new MyModel();
public bool Initialize()
{
Data.A = 1;
Data.B = "Hello world.";
return true;
}
public object GetData()
{
return Data;
}
public void SetData(object newData)
{
Data = (MyModel) newData;
}
[Serializable]
public struct MyModel
{
public int A;
public string B;
}
}
* Для тех, кто читает вопрос перед надлежащим повторным редактированием и уточнением: я перепутал значение Model
(определение структуры) и Data
(экземпляр Model).