Nano Hash - криптовалюты, майнинг, программирование

Как поместить разные объекты в список

У меня есть веб-страница, на которой пользователь может перетаскивать определенные виджеты в один заполнитель. Каждый виджет имеет свой собственный набор свойств.

Например, предположим, что у меня есть следующие виджеты HTML:

Widget1:
 - Title field
 - Technical name field

И еще один виджет, более динамичный:

Widget2:
 - Range picker field 1 (0 to 100)
 - Range picker field 2 (0 to 100)
               ------------------
               | (+) Add picker |
               ------------------
 (can add as many range pickers as needed)

Теперь одним нажатием кнопки эти настройки сохраняются в базе данных. Но в какой-то момент мне также нужно снова прочитать эти данные из него.

Например, предположим, что у меня есть следующие классы для виджетов:

interface IWidget { }

class Widget1 : IWidget
{
    public string Title {get;set;}
    public string TechnicalName {get;set;}
}

class Widget2 : IWidget
{
    public List<int> PickerValues {get;set;}
}

Затем сохраните это в файле List.

var widgets = new List<IWidget>();
widgets.Add(new Widget1());
widgets.Add(new Widget2());

Это сработает. Но тогда снова получить объект из этого списка проблематично:

var widget = widgets.First();
widget.?????   // <-- NO INTELLISENSE!

Это означает, что он не знает, какая у него фактическая реализация. Я должен был бы бросить это. Но как, если я не знаю, какие виджеты там хранятся? Это может быть список из 1, 5 или даже 10 различных виджетов в любом порядке.

Как я могу решить эту проблему?

04.05.2015

  • В качестве примечания: stackoverflow.com/questions/7552677 / 04.05.2015
  • Смысл создания абстракции с интерфейсом в том, что вас не должна заботить конкретная реализация. В настоящее время ваш интерфейс бессмысленен. Что вы хотите делать с этими виджетами? 04.05.2015
  • Что вы хотите сделать с IWidget после того, как вытащите его из списка? 04.05.2015
  • вы можете увидеть о as и является ключевыми словами 04.05.2015
  • IWidget не определяет никаких членов, поэтому вы не получите никакой интеллигенции. Общий функционал нужно разместить в интерфейсе, иначе да, придется лить. 04.05.2015
  • Зачем нужно бросать? какую операцию вы ожидаете выполнить после извлечения виджета? Если это общее поведение для всех виджетов, это должен быть метод интерфейса, и каждый виджет реализует свое конкретное поведение. 04.05.2015
  • С пустым интерфейсом у вас также может быть List<object>, потому что вам придется проверять тип каждого элемента, а затем приводить, чтобы получить intellisense... 04.05.2015

Ответы:


1

В настоящее время у вас есть список объектов, реализующих интерфейс IWidget. Прямой доступ к ним даст вам только информацию о свойствах IWidget (у которых их нет).

Чтобы решить эту проблему, вам нужно либо поместить некоторые свойства в интерфейс IWidget, либо проверить тип каждого элемента, а затем привести его, например:

IWidget widget = widgets.First();

var widget1 = widget as Widget1;

if (widget1 != null)
{
    widget1.TechnicalName = "new name"; // <-- We have intellisense
}

У вас также может быть некоторая логика, которая проверяет каждый виджет в цикле, например:

foreach (var widget in widgets)
{
    if (widget is Widget1)
    {
        var widget1 = (Widget1) widget;
        // Do something with Widget1 types here
    }
    else if (widget is Widget2)
    {
        var widget2 = (Widget2)widget;
        // Do something with Widget2 types here
    }
}

В качестве альтернативы вы можете просто получить первый Widget1 (или Widget2) из ​​списка, выполнив что-то вроде:

Widget1 widget = widgets.OfType<Widget1>().First();
04.05.2015

2

Вам нужно будет использовать полиморфизм для решения вашей проблемы:

interface IWidget 
{
    public void readData();
}

class Widget1 : IWidget
{
    public string Title { get; set; }
    public string TechnicalName { get; set; }

    public void readData()
    {
        Console.WriteLine("- Title: {0}\n- Technical name: {1}", Title, TechnicalName);
    }
}

class Widget2 : IWidget
{
    public List<int> PickerValues { get; set; }

    public void readData()
    {
        StringBuilder builder = new StringBuilder();
        for (int i = 1; i <= PickerValues.Count; i++)
        {
            builder.AppendLine(String.Format("- Range picker field {0}: {1}",i,PickerValues[i-1]));
        }
        Console.WriteLine(builder.ToString());
    }
}

И позже...

        var widgets = new List<IWidget>();
        widgets.Add(new Widget1());
        widgets.Add(new Widget2());
        var widget = widgets.First();
        widget.readData(); // will print correct output for each type of widget, as implemented on each widget.
04.05.2015

3

Возможно, ваш выбор состоит в том, чтобы сначала проверить тип экземпляра:

var widget = widgets.First();
if (widget is Widget1)
{
    var widget1 = (Widget1) widget;
    widget1.DoSomethingSpecificToWidget1();
}

В качестве альтернативы, с дополнительными функциями LinQ, вы можете легко разделить свой список на общие подсписки. Это будет хорошо работать, если вам не нужно обрабатывать виджеты в том порядке, в котором они хранятся в переменной widgets.

var w1List = widgets.OfType<Widget1>();// you may also call `.ToList()`
var w2List = widgets.OfType<Widget2>();

foreach (var w1 in w1List)
{
    w1.DoSomethingSpecificToWidget1(); // w1 is now Widget1
}
04.05.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..