Свойства. Наследования
Cвойства.
Свойства, это не что иное, как поля с логическом блоком, в котором есть ключевые слова get
и set
.
Для доступа к свойству требуется тот же синтаксис, что и для поля.
У каждого свойства есть методы доступа.
Блок кода для метода доступа get
выполняется, когда осуществляется чтение свойства.
Блок кода для метода доступа set
выполняется, когда свойству присваивается новое значение.
Соответсвенно, если свойство без метода get
/set
, оно считается доступным только для записи/чтения.
В отличие от полей свойства не классифицируются как переменные.
Поэтому свойство нельзя передать в качестве параметра ref
или out
.
public class Sas
{
private int number = 9; // переменная
public int Number //свойство
{
get //метод чтения
{
return number;
}
set //метод записи
{
if((value >= 0) && (value < 10)) //условие: если число в диапазоне [0;9]
{
number = value;
}
}
}
// /~
}
Методы get
и set
могут включать в себя некоторую логику, что позволяет более гибко оперировать переменными.
В данном случае в методе set
проверяется условие и, если оно выполняется, переменной присваивается значение value
.
Выполнение метода доступа get
эквивалентно считыванию значения поля. Например, когда возвращается частная переменная из метода доступа get
и разрешена оптимизация, вызов метода доступа get
встраивается компилятором, что позволяет избежать ненужных затрат на вызов метода.
При создании ссылки на свойство, кроме случая присвоения ему значения, для чтения значения свойства вызывается метод доступа get
.
Sas sas = new Sas();
// /~
System.Console.Write(sas.RYTP); //Здесь сработает метода доступа get
Метод доступа get должен заканчиваться оператором return или throw, а элемент управления не должен выходить за основную часть метода доступа. Так же настоятельно не рекомендуется как то влиять на состояние объекта с помощью метода get
.
private int number;
public int Number
{
get
{
return number++; // Так делать нехорошо
}
}
Свойство можно объявить как статическое свойство при помощи ключевого слова static
.
При этом свойство становится доступным для вызова в любое время, даже если экземпляр класса отсутствует.
Свойство можно пометить как статическое свойство при помощи ключевого слова virtual
.
Это позволяет производным классам переопределять поведение свойства при помощи ключевого слова override
.
Свойство, переопределяющее виртуальное свойство, может также быть sealed
, что указывает на то, что для производных классов оно более не является виртуальным.
И наконец, свойство можно объявить как abstract
.
Это означает, что в классе отсутствует реализация, поэтому производные классы должны создавать свою собственную реализацию.
Наследования.
Наследование — концепция объектно-ориентированного программирования, согласно которой абстрактный тип данных может наследовать данные и функциональность некоторого существующего типа, способствуя повторному использованию компонентов программного обеспечения.
А если по простому, то если существует объект А, и объект В наследуется от А, то он имеет всю функциональность объекта А, что была ему предоставлена.
Допустим, у нас есть базовый класс Shape, который содержит две координаты x, y и виртуальный метод Area().
Если метод объявлен как virtual
, то в производном классе это метод можно будет переопределить с помощью своей собственной реализации.
Мы можем создать несколько классов, которые будут от него наследоваться.
public class Shape //базовый класс
{
public const double PI = Math.PI;
protected double x, y;
public Shape()
{
}
public Shape(double x, double y)
{
this.x = x;
this.y = y;
}
public virtual double Area()
{
return x * y;
}
}
public class Circle : Shape //производный класс
{
public Circle(double r) : base(r, 0)
{
}
public override double Area()
{
return PI * x * x;
}
}
class Sphere : Shape //производный класс
{
public Sphere(double r) : base(r, 0)
{
}
public override double Area()
{
return 4 * PI * x * x;
}
}
class Cylinder : Shape //производный класс
{
public Cylinder(double r, double h) : base(r, h)
{
}
public override double Area()
{
return 2 * PI * x * x + 2 * PI * x * y;
}
}
Можно объявить класс как abstract
, если необходимо предотвратить прямое создание экземпляров с помощью ключевого слова new
.
При таком подходе класс можно использовать, только если новый класс является производным от него.
Абстрактный класс может содержать один или несколько сигнатур методов, которые сами объявлены в качестве абстрактных.
Эти сигнатуры задают параметры и возвращают значение, но не имеют реализации.