Кастинг объекта к универсальному интерфейсу

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

$dados[] = array('cd_driver' => $cd_driver, 'Driver' => $RSx["ds_name"], 'month' => $cd_month, 'bsaldo' => $saldoToJson);
$dados2 = array('cd_driver' => $cd_driver, 'Driver' => $RSx["ds_name"], 'month' => $cd_month, 'bsaldo' => $saldoToJson);
$jsonString = file_get_contents('bsaldo.json');
$data = json_decode($jsonString, true);

    if($data == ""){
        $newString = json_encode($dados);
        file_put_contents('bsaldo.json', $newString);
    }else {
        $array = array(); # here it won't be continually reset and can accumulate values as intended.
        foreach ($data as $key => $value) {

            $mot = $value['cd_driver'];

            array_push($array, $mot);

            if(in_array($cd_driver, $array)){
                $data[$key]['month'] = $cd_month;
                $newString = json_encode($data);
                file_put_contents('bsaldo.json', $newString);
            }else {
                array_push($data, $dados2);
                $finalString = json_encode($data);
                file_put_contents('bsaldo.json', $finalString);
            }

        }
    }
25
задан robertkroll 21 October 2008 в 15:58
поделиться

3 ответа

Если бы я понимаю вопрос, то наиболее распространенный подход должен был бы объявить неуниверсальный основной интерфейс, т.е.

internal interface IRelativeTo
{
    object getRelativeTo(); // or maybe something else non-generic
    void setRelativeTo(object relativeTo);
}
internal interface IRelativeTo<T> : IRelativeTo
    where T : IObject
{
    new T getRelativeTo();
    new void setRelativeTo(T relativeTo);
}

, Другая опция для Вас для кодирования в основном в дженериках..., т.е. у Вас есть методы как

void DoSomething<T>() where T : IObject
{
    IRelativeTo<IObject> foo = // etc
}

, Если эти IRelativeTo<T> аргумент DoSomething(), то обычно Вы не должны определять общий аргумент типа сами - компилятор выведет его - т.е.

DoSomething(foo);

, а не

DoSomething<SomeType>(foo);

существуют преимущества для обоих подходов.

23
ответ дан 28 November 2019 в 21:16
поделиться

к сожалению, наследование не работает с дженериками. Если Ваша функция ожидает IRelativeTo, можно сделать функциональный дженерик также:

void MyFunction<T>(IRelativeTo<T> sth) where T : IObject
{}

, Если я помню правильно, когда Вы используете функцию выше Вас, не должны даже определять тип, компилятор должен понять его на основе аргумента, который Вы предоставляете.

, Если Вы хотите сохранить ссылку на один из этих объектов IRelativeTo в классе или методе (и Вы не заботитесь о том, что T - то, что), необходимо сделать этот класс/метод универсальным снова.

я соглашаюсь, это - немного боли.

11
ответ дан 28 November 2019 в 21:16
поделиться

Если все, о чем Вы заботитесь, - то, что IRelativeTo имеет дело с IObjects тогда, Вы не должны делать его универсальным:

interface IRelativeTo
 {
   IObject getRelativeTo();
   void setRelativeTo(IObject relativeTo)
 }

классы с реализацией могут все еще быть универсальными, однако:

abstract class RelativeTo<T>  : IRelativeTo where T : IObject
 {  
   public virtual T getRelativeTo() {return default(T);}

   public virtual void setRelativeTo(T relativeTo) {}

   IObject IRelativeTo.getRelativeTo() {return this.getRelativeTo(); }

   void IRelativeTo.setRelativeTo(IObject relativeTo) 
    { this.setRelativeTo((T) relativeTo);
    }
 }

class AdminRateShift :  RelativeTo<AdminRateShift>, IObject {}

Тогда можно сделать это:

  IRelativeTo irt = new AdminRateShift();
  IObject o = irt.getRelativeTo();
  irt.setRelativeTo(o);
6
ответ дан 28 November 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: