Да.
Свойства авто не являются особым типом свойств.Это удобная функция, которая генерирует код, необходимый для хранения значений свойств в вспомогательном поле.
Вы можете указать реализацию по умолчанию для свойств, как для методов получения, так и для установок.Вы можете попробовать следующий код в 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 для этого примера здесь