Статические методы и методы экземпляра
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Статический метод объявляется с помощью модификатора static. Если модификатор static отсутствует, метод называется методом экземпляра.

При доступе к члену с использованием ссылки на метод в форме E.M для статического метода M параметр E должен означать тип, содержащий M, а для метода экземпляра M — экземпляр типа, содержащего M.

Виртуальные методы

Если объявление метода экземпляра содержит модификатор virtual, метод является виртуальным методом. Если модификатор virtual отсутствует, метод называется невиртуальным методом.

реализация виртуального метода может быть заменена производными классами. Процесс замены реализации унаследованного виртуального метода называется переопределением этого метода

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

using System;

class A
{
public void F() { Console.WriteLine("A.F"); }

public virtual void G() { Console.WriteLine("A.G"); }
}

class B: A
{
new public void F() { Console.WriteLine("B.F"); }

public override void G() { Console.WriteLine("B.G"); }
}

class Test
{
static void Main() {
       B b = new B();
       A a = b;
       a.F();
       b.F();
       a.G();
       b.G();
}
}

















Переопределяющие методы

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

Запечатанные методы

Если объявление метода экземпляра содержит модификатор sealed, метод является запечатанным методом. Если объявление метода экземпляра включает модификатор sealed, оно должно также включать модификатор override. Использование модификатора sealed предотвращает последующее переопределение метода в производном классе.

Абстрактные методы

Если объявление метода экземпляра содержит модификатор abstract, метод является абстрактным методом. Хотя абстрактный метод неявно является также виртуальным методом, он не может иметь модификатора virtual.

Объявление абстрактного метода представляет новый виртуальный метод, но не предоставляет его реализацию. Вместо этого необходимо предоставить неабстрактные производные классы, предоставляющие собственные реализации этого метода посредством его переопределения. Поскольку абстрактный метод не предоставляет фактическую реализацию, тело_абстрактного_метода состоит только из точки с запятой.

Тело метода

Тело_метода содержит блок или точку с запятой.

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

В теле метода, который имеет тип возвращаемого значения void, не допускается использование операторов return для задания выражений.

Если метод возвращает значение, тип которого отличается от void, каждый оператор return в теле этого метода должен задавать выражение, неявно преобразуемое к типу возвращаемого значения.

 

1. Пользовательские преобразования .

Ключевое слово implicit служит для объявления неявного оператора преобразования пользовательского типа. Чтобы выполнить эти преобразования, тип должен определять:

открытые конструкторы с одним параметром;

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

 

Каждый такой метод преобразует экземпляр типа, в котором определен этот метод, в экземпляр другого типа.

 

Пример. Преобразование значения типа Digit к целочисленному типу Byte

Перегрузка операторов.

У всех унарных и бинарных операторов есть стандартная реализация, доступная автоматически в любом выражении. В дополнение к стандартным реализациям объявление operator в классах и структурах позволяет использовать пользовательские реализации. Пользовательские реализации операторов всегда имеют приоритет над предопределенными реализациями операторов.

К унарным операторам, допускающим перегрузку, относятся:

+ - ! ~ ++ -- true false

К бинарным операторам, допускающим перегрузку, относятся:

+ - * / % & | ^ << >> == != > < >= <=

Невозможна перегрузка операторов доступа к членам, вызова методов или операторов =, &&, ||, ??, ?:, =>, checked, unchecked, new, typeof, default, as и is.

При перегрузке бинарного оператора связанный оператор присваивания (если он есть) также неявно перегружается. Например, при перегрузке оператора * также выполняется перегрузка оператора *=. Оператор присваивания ( = ) нельзя перегрузить. При присваивании всегда происходит простое побитовое копирование значения в переменную.

Перегрузка операций приведения типов, например (T)x, осуществляется путем предоставления пользовательских преобразований.

Доступ к элементу, например a[x], не считается оператором, допускающим перегрузку.

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

Стандартные операторы сложения:

int operator +(int x, int y);
uint operator +(uint x, uint y);
long operator +(long x, long y);
ulong operator +(ulong x, ulong y);

у пользовательского оператора не может быть такой же сигнатуры, что и у стандартного оператора, поэтому пример работать не будет:

using System;

namespace ConsoleApplication3

{

class Program

{

  public static int operator +(int a, int b)

   {

       return a + b;

   }

   static void Main(string[] args)

   {

       Int32 a = 5;

       Int32 b = 6;

       Int32 c = a + b;

       Console.WriteLine(c);

   }

}

}

Ошибка. Тип одного из параметров бинарного оператора должен быть вмещающим

Пример.

Типы, определенные пользователем, могут вызвать перегрузку оператора +.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace ConsoleApplication1

{

class myint

{

   int a;

   public myint(int a)

   {

       this.a = a;

   }

   public static myint operator +(myint a, myint b)

   {

       return new myint(a.a + b.a);

   }

   public override string ToString()

   {

       return String.Format("{0}", a);

   }

 

}

 

class Program

{

   static void Main(string[] args)

   {

       myint a = new myint(9);

       myint b = new myint(9);

       myint c = a + b;

       Console.WriteLine(c);

   }

}

 

}

 

Задание.

Методы перегруженных операторов. Перегруженные операторы – это открытые статические методы. У оператора-метода тип одного из параметров или тип возвращаемого значения должен совпадать с типом, в котором определен оператор-метод. Пример .

public class Complex

{

   double re;

   double im;

   public Complex(double re, double im)

   {

       this.re = re;

       this.im = im;

   }

  public static Complex operator+(Complex c1,Complex c2)

   {

       return new Complex(c1.re + c2.re, c1.im + c2.im);

   }

   public override string ToString()

   {

       return String.Format("{0} {1}i",re, im);

   }

}

class Program

{

   static void Main(string[] args)

   {

      Complex c3 = new Complex(2, 4) + new Complex(7, 1);

      Console.WriteLine(c3.ToString());

   }

}

Задание. Перемножить матрицы.

V = [ 17 3-4j -3 3+4j ]






Свойства .

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

Свойства объявляются с помощью объявлений_свойств:

объявление_свойства:
атрибутынеобязательно модификаторы_свойствнеобязательно тип имя_члена { объявления_методов_доступа }

модификатор_свойства:
new
public
protected
internal
private
static
virtual
sealed
override
abstract
extern

имя_элемента:
идентификатор
тип_интерфейса . идентификатор

Тип свойства задает представленный в объявлении тип свойства. Имя члена задает имя свойства. Если в свойстве не содержится явная реализация члена интерфейса, имя члена представляет собой просто идентификатор. При явной реализации члена интерфейса имя члена состоит из типа интерфейса, точки «.» и идентификатора (в указанной последовательности).

Объявления методов_доступа заключаются в фигурные скобки «{» и «}» и объявляют методы доступа свойства. Методы доступа задают исполняемые операторы, связанные с чтением или записью свойства.

Несмотря на то, что для обращения к свойствам и полям используется одинаковый синтаксис, свойство не классифицируется как переменная. Поэтому невозможно передать свойство как аргумент ref или out.















Дата: 2019-03-05, просмотров: 200.