Методы интерфейса по умолчанию и значения по умолчанию для Auto Properties - PullRequest
0 голосов
/ 10 декабря 2018

Учитывая, что свойство auto компилируется в get_method, set_method и приватную переменную и поскольку C # 8 представляет методы интерфейса по умолчанию

Могут ли свойства в интерфейсах иметь реализации по умолчанию?

Особеннополучить только недвижимость?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Да.

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

Вы можете указать реализацию по умолчанию для свойств, как для методов получения, так и для установок.Вы можете попробовать следующий код в Sharplab.io

public interface IDimensions
{
    int Height {get;set;}
    int Width {get;set;}
    int Depth {get;set;}

    int Weight { get=>0; set{} }
    int Density { get=> Weight==0?0:Height*Width*Depth/Weight ; }
}

public class Box:IDimensions
{
    public int Height{get;set;}
    public int Width{get;set;}
}

Управление версиями

Это демонстрирует сценарий управления версиями.Box реализовал версию IDimensions, которая включала только Height, Width.

Weight был добавлен позже с реализацией по умолчанию, которая возвращает 0 и игнорирует записи.Density был добавлен с реализацией по умолчанию, которая возвращает объем / плотность блока, или 0, если нет действительного веса.Box не нужно было менять, хотя интерфейс изменился.Даже код, сгенерированный компилятором, не показывает никаких изменений в классе Box.

Классы могут заменить реализации по умолчанию своими собственными.Ничто не мешает Box добавить int Weight {get;set;} в будущем.

Реализации по умолчанию доступны только через интерфейс:

IDimensions box=new Box();
Console.WriteLine(box.Density);

Черты

Другой сценарий, который обрабатывается реализациями по умолчанию, это черты.

Предположим, я хочу добавить черту IDensity к любому типу предмета.В большинстве случаев мне понадобится только объем и вес элемента для расчета его плотности:

public interface IDensity
{
    int Density 
    { 
        get 
        {
            var weight=getWeight();
            if (weight==0) return 0;
            return getVolume()/weight;
        }
    }

    abstract int getWeight();
    abstract int getVolume();
}

Эта черта вернет упрощенный расчет плотности и вынудит тип, к которому она применяется, реализовать int getWeight() и методы int getHeight():

public class Crate:IDensity
{
    //Dummy numbers
    public int getWeight()=>55;
    public int getVolume()=>100;
}

public class C {
    public void M() {
        IDensity box=new Cake();
        Console.WriteLine(box.Density);
    }
}

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

public class WeddingCake:IDensity
{
    public int getWeight()=>5;
    public int getVolume()=>getWeight()/Density;
    public int Density=>2;
}

Ссылка Sharplab.io для этого примера здесь

0 голосов
/ 10 декабря 2018

Нет.


В предложении говорится:

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

( source )

См. Также интервью на 9 канале Предварительный просмотр C # 8 с Мадсом Торгерсеном , в котором, помимо прочего, они говорят о реализациях интерфейса по умолчанию.


Методы интерфейса по умолчанию не включены в C # 8.0 (бета), который былВыпущено с Visual Studio 2019 Preview 1. На момент написания прототип методов интерфейса по умолчанию все еще находился в разработке.См. Champion "методы интерфейса по умолчанию" .

...