Поделиться через


Объектно-ориентированное программирование (C# и Visual Basic)

В платформе .NET Framework все управляемые языки, например Visual Basic и C#, полностью поддерживают концепции объектно-ориентированного программирования, включая инкапсуляцию, наследование и полиморфизм.

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

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

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

В этом разделе рассматриваются следующие понятия.

  • Классы и объекты

    • Члены класса

      Свойства и поля

      Методы

      Конструкторы

      Деструкторы

      События

      Вложенные классы

    • Модификаторы доступа и уровни доступа

    • Создание экземпляров классов

    • Статические классы (совместно используемые классы) и их члены

    • Анонимные типы

  • Наследование

    • Переопределяющие члены
  • Интерфейсы

  • Универсальные шаблоны

  • Делегаты

Классы и объекты

Термины класс и объект часто взаимозаменяемы, но в действительности классы описывают типы объектов, а объекты — это используемые экземпляры классов. Поэтому процесс создания объекта называется созданием экземпляра. Если использовать сравнение с чертежом, то класс является чертежом, а объект является зданием, построенным по нему.

Определение класса:

Class SampleClass
End Class
class SampleClass
{
}

Языки Visual Basic и C# также предоставляют облегченную версию классов — структуры, которые используются, когда необходимо создать большой массив объектов, использующий небольшой объем памяти.

Определение структуры:

Structure SampleStructure
End Structure
struct SampleStruct
{
}

Дополнительные сведения см. в следующих разделах.

Члены класса

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

Свойства и поля

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

Определение поля:

Class SampleClass
    Public SampleField As String
End Class
Class SampleClass
{
    public string sampleField;
}

Для работы со свойствами используются процедуры "Get" и "Set", которые расширяют возможности управления способом задания и возврата значений.

В языках C# и Visual Basic для хранения значения свойства можно создать частное поле (private) или использовать так называемые автоматически реализуемые свойства, которые автоматически создают это поле и обеспечивают базовую логику для процедур свойств.

Определение автоматически реализуемого свойства:

Class SampleClass
    Public Property SampleProperty as String
End Class
class SampleClass
{
    public int SampleProperty { get; set; }
}

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

Class Samplelass
    Private m_Sample As String
    Public Property Sample() As String
        Get
            ' Return the value stored in the field.
            Return m_Sample
        End Get
        Set(ByVal Value As String)
            ' Store the value in the field.
            m_Sample = Value
        End Set
    End Property
End Class
class SampleClass
{
    private int _sample;
    public int Sample
    {
        // Return the value stored in a field.
        get { return _sample; }
        // Store the value in the field.
        set { _sample = value; }
    }
}

У большинства свойств есть методы или процедуры для задания и возврата значения свойства. Однако можно создать свойства, доступные только для чтения или только на запись, чтобы запретить изменение или чтение значений свойств. Для этого в Visual Basic можно использовать ключевые слова ReadOnly и WriteOnly. В C# можно опустить метод свойства get или set. Следует отметить, что в Visual Basic и C# автоматически реализуемые свойства нельзя сделать доступными только для чтения или только на запись.

Дополнительные сведения см. в следующих разделах.

Методы

Действие, которое выполняет объект, называется методом.

Примечание

В Visual Basic существует два способа создания метода: с помощью оператора Sub (если метод не возвращает значение) или с помощью оператора Function (если метод возвращает значение).

Определение метода класса:

Class SampleClass
    Public Function SampleFunc(ByVal SampleParam As String)
        ' Add code here
    End Function
End Class
class SampleClass
{
    public int sampleMethod(string sampleParam)
    {
        // Insert code here
    }
}

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

Перегрузка метода:

Overloads Sub Display(ByVal theChar As Char)
    ' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
    ' Add code that displays Integer data.
End Sub
public int sampleMethod(string sampleParam) {};
public int sampleMethod(int sampleParam) {}

Как правило, метод объявляется при определении класса. Однако Visual Basic и C# также поддерживают методы расширения, которые позволяют добавлять методы в существующий класс вне определения класса.

Дополнительные сведения см. в следующих разделах.

Конструкторы

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

Определение конструктора для класса:

Class SampleClass
    Sub New(ByVal s As String)
        // Add code here.
    End Sub
End Class
public class SampleClass
{
    public SampleClass()
    {
        // Add code here
    }
}

Дополнительные сведения см. в следующих разделах.

Деструкторы

Деструкторы используются для уничтожения экземпляров классов. В платформе .NET Framework сборщик мусора автоматически управляет распределением и освобождением памяти для управляемых объектов приложения. Однако для очистки неуправляемых ресурсов, создаваемых приложением, могут потребоваться деструкторы. На один класс допускается только один деструктор.

Дополнительные сведения о деструкторах и сборке мусора в платформе .NET Framework см. в разделе Сборка мусора.

События

События позволяют классу или объекту уведомлять другие классы или объекты о возникновении каких-либо ситуаций. Класс, отправляющий (или порождающий) событие, называется издателем, а классы, принимающие (или обрабатывающие) событие, называются подписчиками. Дополнительные сведения о том, как порождаются и обрабатываются события, см. в разделе Обработка и вызов событий.

  • Visual Basic

  • C#

    • Чтобы объявить событие в классе, используйте ключевое слово event (Справочник по C#).

    • Чтобы породить событие, вызовите делегат события.

    • Чтобы подписаться на событие, используйте оператор +=. Чтобы отменить подписку на событие, воспользуйтесь оператором -=.

Вложенные классы

Класс, определенный внутри другого класса, называется вложенным. По умолчанию вложенный класс является частным.

Class Container
    Class Nested
    ' Add code here.
    End Class
End Class
class Container
{
    class Nested
    {
        // Add code here.
    }
}

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

Dim nestedInstance As Container.Nested = New Container.Nested()
Container.Nested nestedInstance = new Container.Nested()

Модификаторы доступа и уровни доступа

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

Имеющиеся модификаторы доступа указаны в следующей таблице.

Модификатор Visual Basic

Модификатор C#

Определение

Public (Visual Basic)

public

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

Private (Visual Basic)

private

Доступ к типу или члену можно получить только из кода в том же классе.

Protected (Visual Basic)

protected

Доступ к типу или члену можно получить только из кода в том же классе или в производном классе.

Friend (Visual Basic)

internal

Доступ к типу или члену возможен из любого кода в той же сборке, но не из другой сборки.

Protected Friend

protected internal

Доступ к типу или члену возможен из любого кода в той же сборке, или из производного класса в другой сборке.

Дополнительные сведения см. в разделах Уровни доступа в Visual Basic и Модификаторы доступа (Руководство по программированию в C#).

Создание экземпляров классов

Чтобы создать объект, необходимо создать экземпляр класса.

Dim sampleObject as New SampleClass()
SampleClass sampleObject = new SampleClass();

После создания экземпляра класса можно присваивать значения свойствам и полям экземпляра и вызывать методы класса.

' Set a property value.
sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()
// Set a property value.
sampleObject.sampleProperty = "Sample String";
// Call a method.
sampleObject.sampleMethod();

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

Dim sampleObject = New SampleClass With 
    {.FirstProperty = "A", .SecondProperty = "B"}
// Set a property value.
SampleClass sampleObject = new SampleClass 
    { FirstProperty = "A", SecondProperty = "B" };

Дополнительные сведения см. в следующих разделах.

Статические классы (совместно используемые классы) и их члены

Статический член (совместно используемый в Visual Basic) класса — это свойство, процедура или поле, которое совместно используется всеми экземплярами класса.

Определение статического (совместно используемого) члена:

Class SampleClass
    Public Shared SampleString As String = "Sample String"
End Class
static class SampleClass
{
    public static string SampleString = "Sample String";
}

Чтобы получить доступ к статическому (совместно используемому) члену, используйте имя класса без создания объекта этого класса:

MsgBox(SampleClass.SampleString)
Console.WriteLine(SampleClass.SampleString);

Статические (совместно используемые) классы в C# и модули в Visual Basic могут содержать только статические (совместно используемые) члены. Нельзя создать экземпляр статического класса. Статические (совместно используемые) члены также не могут обращаться к нестатическим свойствами, полям или методам.

Дополнительные сведения см. в следующих разделах.

Анонимные типы

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

Создание экземпляра анонимного типа:

' sampleObject is an instance of a simple anonymous type.
Dim sampleObject = 
    New With {Key .FirstProperty = "A", .SecondProperty = "B"}
// sampleObject is an instance of a simple anonymous type.
var sampleObject = 
    new { FirstProperty = "A", SecondProperty = "B" };

Дополнительные сведения см. в следующих разделах.

Наследование

Наследование позволяет создавать новые классы, которые повторно используют, расширяют и изменяют поведение, определенное в другом классе. Класс, члены которого наследуются, называется базовым классом, а класс, который наследует эти члены, называется производным классом. Следует учитывать, что все классы в C# и Visual Basic неявно наследуются от класса Object, который поддерживает иерархию классов .NET и предоставляет низкоуровневые службы для всех классов.

Примечание

Управляемые языки в .NET Framework не поддерживают множественное наследование, т. е.можно задать только один базовый класс для производного класса.

Наследование от базового класса:

Class DerivedClass
    Inherits BaseClass
End Class
class DerivedClass:BaseClass{}

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

Указание, что класс не может использоваться в качестве базового класса:

NotInheritable Class SampleClass
End Class
public sealed class A { }

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

MustInherit Class BaseClass
End Class
public abstract class B { }

Дополнительные сведения см. в следующих разделах.

Переопределяющие члены

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

Следующие модификаторы используются для управления переопределением свойств и методов.

Модификатор Visual Basic

Модификатор C#

Определение

Overridable (Visual Basic)

virtual (Справочник по C#)

Разрешает переопределение члена класса в производном классе.

Overrides (Visual Basic)

override (Справочник по C#)

Переопределяет виртуальный (переопределяемый) член в базовом классе.

NotOverridable (Visual Basic)

Не поддерживаются

Запрещает переопределение члена в наследующем классе.

MustOverride (Visual Basic)

abstract (Справочник по C#)

Требует, чтобы член класса был переопределен в производном классе.

Shadows (Visual Basic)

Модификатор new (Справочник по C#)

Скрывает член, наследуемый от базового класса

Интерфейсы

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

Определение интерфейса:

Public Interface ISampleInterface
    Sub DoSomething()
End Interface
interface ISampleInterface
{
    void doSomething();
}

Реализация интерфейса в классе:

Class SampleClass
    Implements ISampleInterface
    Sub doSomething
        ' Method implementation.
    End Sub
End Class
class SampleClass : ISampleInterface
{
    void ISampleInterface.SampleMethod()
    {
        // Method implementation.
    }
}

Дополнительные сведения см. в следующих разделах.

Универсальные шаблоны

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

Определение универсального класса:

Class SampleGeneric(Of T)
    Public Field As T
End Class
Public class SampleGeneric<T> 
{
    public T Field;
}

Создание экземпляра универсального класса:

Dim sampleObject As New SampleGeneric(Of String)
sampleObject.Field = "Sample string"
SampleGeneric<string> sampleObject = new SampleGeneric<string>();
sampleObject.Field = "Sample string";

Дополнительные сведения см. в следующих разделах.

Делегаты

Делегат — это тип, который определяет сигнатуру метода и может обеспечивать связь с любым методом с совместимой сигнатурой. Метод можно запустить (или вызвать) с помощью делегата. Делегаты используются для передачи методов в качестве аргументов к другим методам.

Примечание

Обработчики событий — это ничто иное, как методы, вызываемые с помощью делегатов.Дополнительные сведения об использовании делегатов при обработке событий см. в разделе События и делегаты.

Создание делегата:

Delegate Sub SampleDelegate(ByVal str As String)
public delegate void SampleDelegate(string str);

Создание ссылки на метод, сигнатура которого соответствует сигнатуре, указанной делегатом:

Class SampleClass
    ' Method that matches the SampleDelegate signature.
    Sub SampleSub(ByVal str As String)
        ' Add code here.
    End Sub
    ' Method that instantiates the delegate.
    Sub SampleDelegateSub()
        Dim sd As SampleDelegate = AddressOf SampleSub
        sd("Sample string")
    End Sub
End Class
class SampleClass
{
    // Method that matches the SampleDelegate signature.
    public static void sampleMethod(string message)
    {
        // Add code here.
    }
    // Method that instantiates the delegate.
    void SampleDelegate()
    {
        SampleDelegate sd = sampleMethod;
        sd("Sample string");
    }
}

Дополнительные сведения см. в следующих разделах.

См. также

Основные понятия

Руководство по программированию на C#

Другие ресурсы

Руководство по программированию на Visual Basic