C#: интерфейсные методы get/методы set наследования

Это имеет отношение, как привязка данных настраивается в dotnet платформе, особенно BindingContext. На высоком уровне это означает, что, если Вы не определили иначе, каждая форма и все средства управления формы совместно используют тот же BindingContext. Когда Вы установите DataSource, свойство эти ComboBox будет использовать BindingContext для получения ConcurrenyMangager, который обертывает список. Эти ConcurrenyManager отслеживает такие вещи как текущее выбранное положение в списке.

, Когда Вы устанавливаете DataSource из вторых ComboBox, это будет использовать тот же BindingContext (формы), который приведет к ссылке на тот же ConcurrencyManager как выше используемого для установки привязки данных.

Для получения более подробного объяснения см. BindingContext.

29
задан Eamon Nerbonne 24 November 2009 в 16:49
поделиться

4 ответа

Скрытие метода в интерфейсе не такое уж грубое; Я бы выбрал что-то вроде:

interface IBasicProps {
   int Priority { get; }
   string Name {get;}
   //... whatever
}

interface IBasicPropsWriteable:IBasicProps  {
   new int Priority { get; set; }
   new string Name { get; set; }
   //... whatever
}
class Foo : IBasicPropsWriteable {
    public int Priority {get;set;}
    public string Name {get;set;}
/* optional
    int IBasicProps.Priority {get {return Priority;}}
    string IBasicProps.Name {get {return Name;}}
*/
}
29
ответ дан 28 November 2019 в 01:55
поделиться

Один из способов - просто пропустить наследование интерфейсов. Сделайте один интерфейс только для чтения и один только для записи и при необходимости реализуйте:

interface IBasicPropsReadable {
   int Priority { get; }
   string Name { get; }
}

interface IBasicPropsWriteable  {
   int Priority { set; }
   string Name { set; }
}

class SomeClassReadWrite : IBasicPropsReadable, IBasicPropsWriteable {
    int Priority { get; set; }
    string Name { get; set; }
}

class SomeClassReadOnly : IBasicPropsReadable {
    int Priority { get; }
    string Name { get; }
}
2
ответ дан 28 November 2019 в 01:55
поделиться

Если ваша цель - чтобы было понятнее, когда чтение или запись разрешены, я бы использовал отдельные методы получения и установки, а не свойства.

interface IBasicProps {
   int GetPriority();
   string GetName();
   //... whatever
}

interface IBasicPropsWriteable:IBasicProps  {
   void SetPriority(int priority);
   void SetName(string name);
   //... whatever
}
4
ответ дан 28 November 2019 в 01:55
поделиться

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

public interface IBasicProps
{
   int Priority { get; }
   string Name {get;}
   //... whatever
}

public interface IBasicPropsWriteable
{
   int Priority { get; set; }
   string Name { get; set; }
   //... whatever
}

public class Foo : IBasicProps, IBasicPropsWriteable
{
   public int Priority { get; set; }
   public string Name { get; set; }

   // whatever
}

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

public interface IBasicPropsAll : IBasicProps, IBasicPropsWriteable  { }

public class Foo : IBasicPropsAll
{
   public int Priority { get; set; }
   public string Name { get; set; }

   // whatever
}
1
ответ дан 28 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

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