Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
20 / 20 / 1
Регистрация: 28.02.2011
Сообщений: 72

Методы интерфейсов и их вызовы...

01.11.2011, 22:47. Показов 1418. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Парни, помогайте,что-то я совсем запутался с этими интерфейсами. Читаю Рихтера.
Итак, любые реализации интерфейсов внутренне помечаются как virtual. Виртуальные методы вызываются на реальном объекте, а не на ссылке.
Пример из книги :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
public static class Program {
public static void Main() {
/************************* First Example *************************/
Base b = new Base();
// Calls Dispose by using b's type: "Base's Dispose"
b.Dispose();
// Calls Dispose by using b's object's type: "Base's Dispose"
((IDisposable)b).Dispose();
/************************* Second Example ************************/
Derived d = new Derived();
// Calls Dispose by using d's type: "Derived's Dispose"
d.Dispose();
// Calls Dispose by using d's object's type: "Derived's Dispose"
 
((IDisposable)d).Dispose();
/************************* Third Example *************************/
b = new Derived();
// Calls Dispose by using b's type: "Base's Dispose"
b.Dispose();
// Calls Dispose by using b's object's type: "Derived's Dispose"
((IDisposable)b).Dispose();
}
}
// This class is derived from Object and it implements IDisposable
internal class Base : IDisposable {
// This method is implicitly sealed and cannot be overridden
public void Dispose() {
Console.WriteLine("Base's Dispose");
}
}
// This class is derived from Base and it re-implements IDisposable
internal class Derived : Base, IDisposable {
// This method cannot override Base's Dispose. 'new' is used to indicate
// that this method re-implements IDisposable's Dispose method
new public void Dispose() {
Console.WriteLine("Derived's Dispose");
// NOTE: The next line shows how to call a base class's implementation (if desired)
// base.Dispose();
}
}
Итак, во всех трёх примерах вызов b.Dispose() (или d.Dispose()) происходит "напрямую",то есть используя тип ссылки. Почему так происходит, если эти методы внутренне помечаются как виртуальные?!?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.11.2011, 22:47
Ответы с готовыми решениями:

Методы интерфейсов по умолчанию
С нововведением в Java 8 абстрактные классы ушли в прошлое?

Почему стандартный класс LinkedList не реализует все методы своих интерфейсов?
Здравствуйте. Стало интересно. Посмотрел документацию класса LinkedList, посмотрел интерфейсы которые реализует этот класс. И увидел,...

Разработка интерфейсов, использование механизма наследования интерфейсов и применение их в программах
Имеется код, необходимо реализовать, и протестировать эти интерфейсы IComparable (сравнимый), ICloneable (клонируемый). Помогите...

7
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
01.11.2011, 22:52
Ну грубо говоря в интерфейсе вы описываете сигнатуру метода! А уже реализуете его вы в классе который наследует от интерфейса(так же как и виртуальные методы базового класса)! Только для реализации интерфейса вам ненужно писать override! А для наглядности можна писать вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        interface IPrint
    {
        void Print(string str);
    }
 
    class Printer : IPrint
    {
        void IPrint.Print(string str)
        {
            Console.WriteLine("{0}", str);
        }
    }
0
20 / 20 / 1
Регистрация: 28.02.2011
Сообщений: 72
01.11.2011, 23:04  [ТС]
Не понимаю :/
Есть класс b, реализующий интерфейс IDisposable
В IL коде этого класса метод Dispose() помечается флагом Virtual.
Но вызывая его через b.Dispose() мы получаем вызов НЕВИРТУАЛЬНОГО экземплярного метода.
0
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
01.11.2011, 23:06
Вы наверное перепутали понятие "виртуальный" и "абстрактный"! Да, абстрактный нельзя вызвать, так как он создаётся только в абстрактном классе! А экземпляр абстрактного класса создать нельзя, от него можно только наследовать! А виртуальный указывает на то что в производном классе есть возможность изменить его реализацию!
0
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
02.11.2011, 13:15
Celly, а можете подробнее обььяснить разницу между виртуальным и абстрактным классом? Абстрактныи - это только базовыи класс, но и виртуальный и абстрактный можно перегрузить. Например , если есть класс Figura и 2 наследуемых класса Сircle и Triangle.В Figura есть метод вычисления площади Square, a в Сircle и Triangle этот метод перегружается, соответственно. Вопрос- какими правильно определять эти методы и классы - виртуальными или абстрактными?
0
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
02.11.2011, 13:24
iva_a, Нет такого понятия как "Виртуальный класс"! Есть понятие абстрактный класс! Есть поняти виртуальный метод, свойство и т.д. и так же и абстрактный метод, свойство и т.д. Виртуальный вы можете определить как в обычном классе так и абстрактном! И соответственно можете переопределить сам виртуальный метод в производном классе! Если вы создаёте в классе хотя -бы один абстрактный метод, свойство и т.д. то класс становится абстрактным! И если вы неукажете в имени класс модификатор abstract то у вас даже неоткомпилируется программа!
В вашем случае просто создайте в базовом классе виртуальный метод Square и уже переопределяйте его соответственно в производных классах!
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
02.11.2011, 15:15
Виртуальный метод - это метод, который можно переопределить в наследуемом классе.
Абстрактный метод - это метод, который нужно переопределить в наследуемом классе.
1
20 / 20 / 1
Регистрация: 28.02.2011
Сообщений: 72
02.11.2011, 21:26  [ТС]
Уххх, нарыл-таки Essential .NET дона бокса )))))) Ушёл читать ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.11.2011, 21:26
Помогаю со студенческими работами здесь

Не понимаю вызовы
Абсолютно не понимаю вызовы. Учусь по книге Страуструпа. ... void print_square(int v); { ...

вызовы конструкторов
обьясните вызов конструторов #include <iostream> using namespace std; class ar { int *p; int size; public:

Cис. вызовы
Доброго времени суток, подскажите ошибку в коде, а то уже пару дней голову ломаю - не компилица... #include <stdio.h> #include...

Системные вызовы
Как осуществить вывод счета в секундах на консоль (своеобразный таймер). и как организовать отсчет числа секунд в обратном направлении? ...

Системные вызовы
Дали задание: • Вывести имя компьютера; • Вывести имя пользователя; • Вывести версию ядра операционной системы; • Применить в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru