Интерфейсное наследование

$(document).ready(function() {
  let percentValue = 0,
    progressBar = $('.progress-bar');
  timer = setInterval(startBar, 500);

  $.ajax({
    url: "http://www.mocky.io/v2/5c3f66243500002d2cec3954",
    type: "GET",
    dataType: "json",
    beforeSend: function() {
      startBar();
    },
    success: function() {
      clearInterval(timer);
    }
  }).done(function(data) {
    alert("success");
    console.log(data);
  }).fail(function(jqxhr, textStatus, error) {
    var err = textStatus + ", " + error;
    console.log("Request Failed: " + err);
  });

  function startBar() {
    if (percentValue < 100) {
      percentValue += 25;

    }
    progressBar.css("width", percentValue + "%").html(percentValue + "%");
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="progress">
  <div class="progress-bar" role="progressbar"></div>
</div>

9
задан leora 17 January 2009 в 12:12
поделиться

4 ответа

Нет, Вы не можете!

(Я собирался записать "Да", но после того, чтобы читать сообщение Anthony и испытания несколько тонких настроек, я нашел, что ответ был НЕТ!)

class FooBar : IFoo, IBar
{
    public int Offset{get;set;}
}

(Генерирует предупреждение, как Anthony указывает, который может быть зафиксирован путем добавления "нового" ключевого слова.)

При испытании кода:

IBar a = new FooBar();
a.Offset = 2;
int b = a.Offset;

Последняя строка генерирует ошибку компиляции, так как Вы скрыли метод set Смещения IBAR.

Править: Закрепленный accesibillity модификатор на свойстве в классе. Спасибо Anthony!

7
ответ дан 4 December 2019 в 11:08
поделиться

Это близко, но никакой банан.

interface IFoo
{
    int Offset { get; }
}

interface IBar : IFoo
{
    new int Offset { set; }
}

class Thing : IBar
{
    public int Offset { get; set; }
}

Отметьте new ключевое слово в IBar, но это переопределяет получить средство доступа IFoo, таким образом, IBar не имеет получения. Следовательно не Вы не можете на самом деле создать IBar, который просто добавляет набор, пока хранение существующего добирается.

7
ответ дан 4 December 2019 в 11:08
поделиться

+1 к Arjan Einbu

Конечно, потребители IBar не смогут получить значение свойства Offset, потому что наследование IFoo не изменяется семантический из свойства Offset, определенного в IBar - компилятор предупреждает Вас по причине. Когда Вы используете "новый" компилятор ключевого слова, полностью удаляет разрешение неоднозначности и рассматривает IBar. Смещение как только для записи. Однако потребители класса, наследованного от интерфейса IBar, смогут получить и установить свойство Offset.

Там различие становится более примечательным при использовании явной интерфейсной реализации:

class Boo: IBar
{
    int IFoo.Offset { get { return 0; } }
    int IBar.Offset 
    {
          set { }  // OK - IBar has a setter
          get { return 1; } // compiler error - IBar.Offset doesn't inherit setter

    }
}

class Program
{
    static void Main(string[] args)
    {
        Boo b = new Boo();
        int x = ((IFoo) b).Offset; // OK - IFoo.Offset has getter
        ((IBar) b).Offset = 1; // OK - IBar.Offset has setter
        x = ((IBar) b).Offset; // compiler error - IBar doesn't inherit 
                               // getter from IFoo
    }
}
3
ответ дан 4 December 2019 в 11:08
поделиться

То, что Вы могли сделать, имеет IBar-интерфейс, имеющий метод считывания и метод set (нет действительно никакого смысла из не наличия этого). Когда у Вас только есть метод set в IBar, Вы действительно явно говорите, что "в интерфейсе IBar Смещение propery только для записи", это, очевидно, не, что Вы хотите.

interface IFoo 
{ 
    int Offset { get;}
}

interface IBar : IFoo 
{
    new int Offset { get; set; } 
}

class Thing : IBar 
{
    public int Offset
    {
        get;
        set;
    }
}

Теперь можно использовать класс Вещь как это:

var t = new Thing();
t.Offset = 1;
int read = t.Offset;
2
ответ дан 4 December 2019 в 11:08
поделиться
Другие вопросы по тегам:

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