Разница между абстрактным и виртуальным методами



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

На примере ниже показан абстрактный и виртуальный метод. В абстрактном классе, виртуальный метод отмечает пять гостей, но в программе производного класса количество было изменено на 20 гостей. Какой же будет результат в виртуальном методе? 5 или 20 гостей?

abstract class GuestVist

{

public abstract void purposeofVisit(); // Abstract Method

public virtual void NoofGuestwillvisit() // Virtual Method

{

Console.WriteLine("Total 5 Guest will Visit your Home");

}

}

class AbstractHouseClass : GuestVist

{

public override void purposeofVisit() // Abstract method Override

{

Console.WriteLine("Abstract just for a Meetup and spend some time ");

}

public override void NoofGuestwillvisit() // Virtual method override

{

Console.WriteLine("Total 20 Guest Visited our Home");

}

static void Main(string[] args)

{

AbstractHouseClass objHouse = new AbstractHouseClass();

objHouse.purposeofVisit();

objHouse.NoofGuestwillvisit();

Console.ReadLine();

}

}

Завершенная программа

abstract class GuestVist

{

public void Guestwelcomemessage()

{

Console.WriteLine("Welcome to our AbstractHome");

}

public void GuestName()

{

Console.WriteLine("Guest name is: Abstract");

}

public abstract void purposeofVisit(); // Abstract Method

public virtual void NoofGuestwillvisit() // Virtual Method

{

Console.WriteLine("Total 5 Guest will Visit your Home");

}

}

class AbstractHouseClass : GuestVist

{

public override void purposeofVisit() // Abstract method Override

{

Console.WriteLine("Abstract just for a Meetup and spend some time ");

}

public override void NoofGuestwillvisit() // Virtual method override

{

Console.WriteLine("Total 20 Guest Visited our Home");

}

static void Main(string[] args)

{

AbstractHouseClass objHouse = new AbstractHouseClass();

objHouse.Guestwelcomemessage();

objHouse.purposeofVisit();

objHouse.NoofGuestwillvisit();

Console.ReadLine();

}

}

12. Недоступный класс/метод

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

Что произойдет, если Вы унаследуете надоступный класс в производном классе?

Рассмотрим пример ниже. Вы видите пример программы недоступного класса.

public sealed class OwnerofficialRoom

{

public void AllMyPersonalItems()

{

Console.WriteLine("All Items in this rooms are personal to me no one else can access or inherit me");

}

}

class HouseSealedClass

{

static void Main(string[] args)

{

OwnerofficialRoom obj = new OwnerofficialRoom();

obj.AllMyPersonalItems();

Console.ReadLine();

}

}

Недоступный метод: Если Вы объявили метод недоступным, то нельзя заместить определенный метод в производном классе. Давайте посмотрим Ваш класс дома, где есть базовый класс с виртуальным методом и виртуальным недоступным методом. Виртуальный метод может быть замещен в производном классе. Но виртуальный недоступный метод нельзя заместить в недоступном классе.

public class OwnerOfficialroomwithrestriction

{

public virtual void message()

{

Console.WriteLine("Every one belongs to this house can access my items in my room except my sealed Item");

}

public virtual sealed void myAccountsLoocker()

{

Console.WriteLine("This Loocker can not be inherited by other classes");

}

}

class HouseSealedClass : OwnerOfficialroomwithrestriction

{

public override void message()

{

Console.WriteLine("overrided in the derived class");

}

public override void myAccountsLoocker()

{

Console.WriteLine("The sealed method Overrides");

}

}

13. Статический класс/метод

Статический класс и недоступный класс нельзя унаследовать.

Разница между статическим и недоступным классами

Можно создать объект (пример) недоступного класса. В секции недоступного класса создать образец недоступного класса, а в главном методе создать объект для доступа к недоступному классу. В недоступном классе можно прописать статические и нестатические методы.

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

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

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

Что произойдет, если ввести нестатических метод в статический класс?

Вы увидите сообщение об ошибке: "Не удается создать экземпляр статического класса".

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

Очень просто. Можно использовать "ClassName.Variable или Method Name", например, "OwnerofficialRoom.AllMyPersonalItems ();"

Смотрите следующий пример со статическим классом:

public static class OwnerofficialRoom

{

public static void AllMyPersonalItems()

{

Console.WriteLine("All Items in this rooms are personal to me no one else can access or inherit me");

}

}

class HouseStaticClass

{

static void Main(string[] args)

{

OwnerofficialRoom.AllMyPersonalItems();

Console.ReadLine();

}

}

Результат предыдущей программы показан ниже:

Можно ли создать статический метод в нестатическом классе?

Да, можно создать статический метод в нестатическом классе. Нет необходимости создавать объект для доступа статического метода (ов) в нестатическом классе. Можно непосредственно использовать имя класса для доступа к статическому методу.

Пример статического метода в нестатическом классе.

public class OwnerofficialRoom

{

public static void AllMyPersonalItems()

{

Console.WriteLine("No need to create object for me just use my class name to access me :)");

}

public void non_staticMethod()

{

Console.WriteLine("You need to create an Object to Access Me :(");

}

}

class StaticmethodClass

{

static void Main(string[] args)

{

OwnerofficialRoom.AllMyPersonalItems();

OwnerofficialRoom obj = new OwnerofficialRoom();

obj.non_staticMethod();

Console.ReadLine();

}

}

14. Интерфейс

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

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

interface GuestInterface

{

void GuestWelcomeMessage();

void NoofGuestes();

}

interface FriendsandRelationsInterface

{

void friendwelcomemessage();

void FriendName();

}

class HouseOwnerClass : GuestInterface, FriendsandRelationsInterface

{

public void GuestWelcomeMessage()

{

Console.WriteLine("All guests are well come to our home");

}

public void NoofGuestes()

{

Console.WriteLine("Total 15 Guestes has visited");

}

public void friendwelcomemessage()

{

Console.WriteLine("Welcome to our Home");

}

public void FriendName()

{

Console.WriteLine("Friend name is: Afraz");

}

static void Main(string[] args)

{

HouseOwnerClass obj = new HouseOwnerClass();

obj.GuestWelcomeMessage();

obj.NoofGuestes();

obj.friendwelcomemessage();

obj.FriendName();

Console.ReadLine();

}

}

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

Проведем аналогию с гостями, которые посещают Ваш дом. Предположим, для гостей разослали два типа сообщений: "Добро пожаловать" и "Вход для гостей запрещен". Функции являются общими, но разнятся для каждого владельца в одном и том же доме. Гость может быть гостем отца, матери, детей или всей семьи. У каждого гостя свое сообщение-приглашение, но функции те же, что в сообщении. Отец – это класс, мать – класс и дети – один класс. Оба сообщения для гостей «Добро пожаловать» и «Вход для гостей запрещен" – одинаковы для всех. В этом случае, можно создать интерфейс и объявить оба метода в интерфейсе. Классы отца, матери и детей могут наследовать интерфейс и вводить собственные детали метода.

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

Что произойдет, если объявить неабстрактные методы в интерфейсе?

Вы увидете предупреждение "неожиданный модификатор" в модификаторе доступа и "неожиданное содержание метода" в тексте сообщения.

Пример программы для интерфейса:

interface GuestInterface

{

void GuestWelcomeMessage();

void NoofGuestes();

}

class HouseOwnerClass: GuestInterface

{

public void GuestWelcomeMessage()

{

Console.WriteLine("All guests are well come to our home");

}

public void NoofGuestes()

{

Console.WriteLine("Total 15 Guestes has visited");

}

static void Main(string[] args)

{

HouseOwnerClass obj = new HouseOwnerClass();

obj.GuestWelcomeMessage();

obj.NoofGuestes();

Console.ReadLine();

}

}

 

 


Дата добавления: 2021-03-18; просмотров: 88; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!