Защита Windows приложений


Замечание. Модификаторов доступа существует больше чем два, но остальные мы рассмотрим ниже. Определяя элемент как private



бет24/30
Дата08.02.2022
өлшемі351,5 Kb.
#118228
1   ...   20   21   22   23   24   25   26   27   ...   30
Байланысты:
lectures.SeminarNET

Замечание. Модификаторов доступа существует больше чем два, но остальные мы рассмотрим ниже.

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


Определяя метод или свойство как public мы указываем компилятору, что разрешаем обращаться к нему из другого класса.
Таким образом, код выше будет выглядит так:

class List


{
private int nCount;
...
public void Add(. . .){. . .}
public void Remove(. . .){. . .}
public int GetCount()
{
return nCount;
}
}

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


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

Объявление класса


Объявление класса очень похоже на объявление структуры. Для того чтобы создать класс в C# необходимо сделать следующее:

  • используйте ключевое слово class, так же как и слово struct при объявлении структур

  • объявите ваши данные внутри класса

  • объявите ваши методы внутри класса

  • расставьте модификаторы доступа для ваших данных и методов. Два модификатора доступа мы уже выучили – это public и private. Существуют еще три, которые мы рассмотрим позже. По умолчанию модификатор доступа является private.

Рассмотрим пример класса в C#.

class Test


{
private string firstName;
private string lastName;
private int age;
public void setPeople(string firstName,string lastName,
int age)
{
this.firstName=firstName;
this.lastName=lastName;
this.age=age;
}
public string GetFirstName()
{
return firstName;
}

public string GetLastName()


{
return lastName;
}

public int GetAge()


{
return age;
}
}

Рассмотрим пример, который создает переменную нашего класса. Попробуем создать экземпляр класса подобно тому, как создавали экземпляр структуры:


static void Main()


{
Test peop;
peop.SetPeople(“first”,”second”,35);
}

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


static void Main()


{
Test peop = new Test();
peop.SetPeople(“first”,”second”,35);
}

В этом блоке кода выделяется память под конкретный объект и все будет работать.


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

Ключевое слово this


Рассмотрим пример.

class Test


{
private string firstName;
private string lastName;
private int age;
public void setPeople(string firstName,string lastName,
int age)
{
firstName=firstName;
lastName=lastName;
age=age;
}
}

В этом примере мы имеем переменные, которые совпадают с параметрами, передаваемыми методу класса. Подобная конструкция не будет иметь никакого эффекта. Существуют два способа решения этой проблемы. Первый это переименовать передаваемые параметры.


class Test


{
private string firstName;
private string lastName;
private int age;
public void setPeople(string firstName1,string lastName1,
int age1)
{
firstName=firstName1;
lastName=lastName1;
age=age1;
}
}

Этот метод не является хорошим, так как нет гарантии, что параметры с новыми именами также не объявлены в классе, кроме того, если имя переменной достаточно информативно, то менять его нет смысла.


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

class Test


{
private string firstName;
private string lastName;
private int age;
public void setPeople(string firstName,string lastName,
int age)
{
this.firstName=firstName;
this.lastName=lastName;
this.age=age;
}
}

Статические данные и методы


Предположим что в вашем классе хранится число жестких дисков компьютера, на котором выполняется программа. Таким образом, переменная, которая хранит эту информацию, будет одинаковой для каждого из объектов этого класса.
Однако, хранить переменную в каждом объекте является плохим стилем. Такой дизайн будет требовать больше памяти при хранении нескольких объектов, для каждого объекта инициализация этой переменной будет занимать какое-то время, хотя фактически эту переменную необходимо инициализировать один раз.
Эти проблемы может решить объявление переменной как глобальной. Объявление глобальной переменной является плохим стилем программирования в ООП, поэтому этот способ не совсем хорош и не может быть использован в C#. Однако есть и другой метод решения проблемы. Это делается с помощью ключевого слова static. Статическая переменная содержится в классе, но выделение памяти под эту переменную происходит один раз, причем не зависит от того, существуют ли у нас объекты данного класса. Эта переменная ассоциируется не с объектом, а с классом и создается на этапе запуска программы. Каждый объект класса, осуществляющий доступ к этой переменной, будет использовать один и тот же кусок памяти.
Рассмотрим два примера, демонстрирующих различие между статической и не статической переменными.

//пример 1


using System;

class TestStatic


{
private static int i=0;

public int GetI()


{
return i;
}

public void Inc()


{
i++;
}
}

class Test


{
static void Main()
{
TestStatic st1=new TestStatic();
st1.Inc();
Console.WriteLine(st1.GetI());
TestStatic st2=new TestStatic();
st2.Inc();
Console.WriteLine(st1.GetI());
}
}

//пример 2


using System;

class TestStatic


{
private int i=0;

public int GetI()


{
return i;
}

public void Inc()


{
i++;
}
}

class Test


{
static void Main()
{
TestStatic st1=new TestStatic();
st1.Inc();
Console.WriteLine(st1.GetI());
TestStatic st2=new TestStatic();
st2.Inc();
Console.WriteLine(st1.GetI());
}
}

Первый пример демонстрирует использование статической переменной. Мы создаем два экземпляра одного и того же класса, а затем вызываем у каждого из них функцию, увеличивающую статическую переменную на 1. И выдаем переменную на экран. В первом примере на экране появятся цифры 1 и 2. а во втором 1 и 1, так как во втором примере переменная у каждого экземпляра класса своя.


Для работы со статическими данными должны существовать методы и логично предположить, что эти методы должны быть тоже статические.
Статические функции определяются также как и статические данные с помощью ключевого слова static. Вы можете контролировать доступ к статическим функциям также как и к простым функциям.
Так как статический метод, как и статические данные, существуют на уровне класса, а не на уровне объекта, то они имеют доступ только к статическим данным и статическим методам. Статические методы можно вызывать, не создавая экземпляр конкретного класса.
В свою очередь обычные методы могут вызывать статические методы класса без особых проблем.
Если в качестве параметров статическому методу передать объект класса, в котором он объявлен, то он сможет иметь доступ ко всем элементам этого объекта, даже если они объявлены как private.
В статическом методе нельзя использовать ключевое слово this.

class Time


{
...
public static void Reset(Time t)
{
t.hour = 0; // Okay
t.minute = 0; // Okay
hour = 0; // compile-time error
minute = 0; // compile-time error
}
private int hour, minute;
}

Рассмотрим наш самый первый пример:


using System;


class Hello


{
static void Main()
{
Console.WriteLine("Hello, World");
}
}

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


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


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

class Company


{
public class Account
{
. . . . . .
}

private class AccountBalance


{
. . . . . .
}
}

class Program


{
static void Main( )
{
Company.Account variable;

//ошибка компиляции. Класс не доступен


Company.AccountBalance variable2;
}
}

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


Другие принципы ООП в С#


Рассмотрим, какие методы предлагает ООП помимо инкапсуляции.

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


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



Какой способ выбрать решать вам. Я больше склоняюсь ко второму. Создание классов на основе уже существующих с передачей функций и свойств от родительских и называется наследованием.
Создавать новые классы можно на основе нескольких классов. Ниже показан пример.



К сожалению C# не поддерживает множественное наследование как С++, но сюда добавлены интерфейсы как и в Java. И вы можете создать свой класс, реализовав в нем более чем один интерфейс. В других главах мы будем рассматривать понятие наследование более подробно.

Полиморфизм


Предположим мы создали класс музыканта на основе которого построили два класса: гитарист и виолончелист.



Все музыканты умеют настраивать свои инструменты. Если мы имеем целый оркестр музыкантов, и хотим попросить их настроить свои инструменты, то нам проще обращаться сразу и к гитаристам и к виолончелистам одновременно, и просить всех музыкантов настроить все свои инструменты, чем отдельно гитаристов и отдельно виолончелистов. Полиморфизм позволяет вызвать именно ту функцию, которая необходима, то есть все музыканты начинают настраивать свои инструменты тем способом, который подходит для их инструментов, а не тем, которым умеет настраивать «обычный музыкант».
Введение в ADO.NET.

Когда я начинал изучать языки программирования, моя практика ограничивалась написанием небольших приложений, которые проводили вычисления и что-то выдавали на экран или в файл. Лишь когда я начал разрабатывать приложения для реальных клиентов я осознал, что большинство приложений так или иначе работают с базами данных и большую часть кода занимают не вычисления и не интерфейс а именно реализация взаимодействия с базами. На тот момент практически все книги давали знания только по основам программирования и мне пришлось перечитать много документации, пока я познакомился с ADO (ActiveX Data Objects) – технологией Microsoft по доступу к хранилищам данных. Мне тогда эта технология показалась простой и эффективной. Я мог писать свои приложения не заботясь о том какая система управления базами данных используется, либо это база под Oracle, либо под SQL Server, толи это простой .mdb файл Microsoft Access.


С появлением .NET платформы компания Microsoft значительно усовершенствовала технологию по доступу к хранилищам информации. Хотя говорить «усовершенствовала» наверное будет неправильно, поскольку это скорее новая технология, реализующая принципиально новый способ работы с хранилищами данных. Я не случайно сказал хранилищами информации, так как данные могут хранится как в базах данных, так и в простых текстовых файлах. Как мы увидим ниже, новая технология позволяет работать с множеством хранилищ информации. Итак, Microsoft представляет новую технологию по доступу к данным – ADO.NET. Эта технология включает в себя все возможности, которые присутствовали в ADO, поэтому для программистов баз данных не составит труда начать разработку своих приложений, используя ADO.NET. ADO.NET имеет и много новых возможностей, кроме того, эта технология базируется немного на более другой идеалогии чем ADO. Попытаемся в этой части рассмотреть все аспекты работы с ADO.NET.

Хранилища данных


Как мы уже говорили, ADO.NET может осуществлять доступ к хранилищам информации, которые различаются между собой методами хранения информации. Давайте рассмотрим типы хранилищ, которые могут встречаться на практике.
1   ...   20   21   22   23   24   25   26   27   ...   30




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет