Тип возвращаемого значения «Decorate» в дочерних классах C#C#

Место общения программистов C#
Anonymous
Тип возвращаемого значения «Decorate» в дочерних классах C#

Сообщение Anonymous »

Цель: Сериализация данных из класса, при этом базовый класс заботится о его свойствах, а дочерние классы заботятся только о добавленных «новых» свойствах.
Отказ от ответственности: Я работаю на TypeScript, и с тех пор, как я работал на C/C++/Java, прошло слишком много времени;)
Моя идея в TS была бы такой:

Код: Выделить всё

interface ParentData {
foo: string;
}

class Parent {
foo: string;

public getSerializableData(): ParentData {
// Parent only knows about foo, serializes it:
return { foo: this.foo };
}
}

interface ChildData extends ParentData {
foo: string;
}

class Child extends Parent {
bar: string;

public getSerializableData(): ParentData {
// child doesn't need to know how parent's data is serialized,
// so just "extends" the data from the parent, with its own:
const data = super.getSerializableData() as ChildData;
data.foo = this.foo;
return foo;

// or this version if you prefer maintaining types without casting:
const data = super.getSerializableData();
return {
...data,
foo: this.foo,
};
}
}

const instance: Parent = new Child();
const serialized = JSON.stringify(instance.getSerializableData());
Итак... в C# мне не очень нравится идея заново создавать/копировать весь объект в дочерних элементах, например...

Код: Выделить всё

// omitting the Parent class...

public class Child : Parent
{
public class Data : Parent.Data
{
string bar;
}

private string bar;

public override Parent.Data GetSerializableData()
{
var data = base.GetSerializableData();
return new Child.Data() {
foo = data.foo,
bar = data.bar,
};
}
}
Кроме того, мне не нравится идея простого создания сериализуемых данных в виде словаря... (но это был бы просто вопрос добавление дополнительных ключей... и тип возвращаемого значения всегда будет одним и тем же)
И в любом случае я чувствую, что он сломается из-за управления приведением типов и того, что он является другим типом объекта, даже если Я использую настройку TypeNameHandling.Auto

Код: Выделить всё

using Newtonsoft.Json;

JsonSerializerSettings settings = new JsonSerializerSettings {
TypeNameHandling = TypeNameHandling.Auto,
};
string data = JsonConvert.SerializeObject(
new Child().GetSerializableData(),
settings
);
Итак, прихожу за идеями, которые познакомят меня с миром C# :)


Подробнее здесь: https://stackoverflow.com/questions/787 ... ld-classes

Вернуться в «C#»