Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

c# интерфейсы public и explicit: когда что лучше?

303  
anly коренной житель14.05.17 14:52
anly
14.05.17 14:52 

interface Aaa

{

void aaa();

}

class Bbb : Aaa

{

public void aaa() { } // public

}

class Ccc : Aaa

{

void Aaa.aaa() { } // explicitly

}


Функция aaa() по разному объявлена в Bbb и в Ccc.

Мне больше нравится Ccc. Но все же что лучше и в каких ситуациях?

Проклят нарушающий межи ближнего своего (Втор.27:17)
#1 
NightWatch коренной житель14.05.17 15:21
NightWatch
NEW 14.05.17 15:21 
в ответ anly 14.05.17 14:52, Последний раз изменено 14.05.17 15:21 (NightWatch)

В первом случае метод доступен через ссылку на экземпляр класса и/или интерфейса.

Во втором случае - только интерфейса.

#2 
anly коренной житель14.05.17 15:49
anly
NEW 14.05.17 15:49 
в ответ NightWatch 14.05.17 15:21, Последний раз изменено 14.05.17 15:50 (anly)

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

Но не пойму: зачем эти ограничения (во втором случае)? Какой плюс от этого и в какой ситуации?

Проклят нарушающий межи ближнего своего (Втор.27:17)
#3 
NightWatch коренной житель14.05.17 15:58
NightWatch
AlexNek патриот16.05.17 00:07
AlexNek
NEW 16.05.17 00:07 
в ответ anly 14.05.17 15:49
второй случай даже из самого же класса не вызовешь.

Через кастинг вызывается.


зачем эти ограничения (во втором случае)?

Вообще то лучше спросить - а нафига енто вообще нужно?

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

Можно сделать одну, а можно две или три.

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

#5 
anly коренной житель16.05.17 21:48
anly
NEW 16.05.17 21:48 
в ответ AlexNek 16.05.17 00:07

"удобные" не зря в кавычках. СиШарп как я понял, и за что его уважаю, как раз пытается исключить неоднозначности и ошибки самим языком (с сиплюсами сравниваю), а вот возможность такой двойной имплементации одной и той же функции - кажись путь к ошибкам (я уже раз напоролся, может по неопытности).

Проклят нарушающий межи ближнего своего (Втор.27:17)
#6 
AlexNek патриот16.05.17 23:32
AlexNek
NEW 16.05.17 23:32 
в ответ anly 16.05.17 21:48
а вот возможность такой двойной имплементации одной и той же функции - кажись путь к ошибкам

Плохой дизайн всегда сделать проще чем хороший. Только замечаешь это не сразу.

Просто без возможности подобной имплементации было бы гораздо хуже.


Вот еще маленький примерчик для ModelViewPresenter. Допустим, для закрытия формы(View) есть фунция Shutdown у презентера/контроллера. Реализуй мы ее как обычно "открытой", имеем большой сооблазн вызвать ее напрямую из формы Shutdown(). А так делаем "закрытой" IView.Shutdown() {} и чтобы вызвать из формы нужно "извратиться" а через презентер или интерфейc View-a - но проблемо (presenter.Shutdown(), view.Shutdown()). В подсказках Shutdown тоже не будет. Какое никакое - а удобство.

#7 
Murr патриот17.05.17 09:22
Murr
NEW 17.05.17 09:22 
в ответ anly 16.05.17 21:48

кажись путь к ошибкам

-----

немножко есть.

Но выигрыш - больше.

Была в одном проекте иерархия - для каждого уровня свой класс.

Потом шеф решил все это коллапсировать... работать оно, разумеется, перестало....

Но вот разгребали именно имплементацией множества интерфейсов...

#8 
  moose свой человек17.05.17 23:03
NEW 17.05.17 23:03 
в ответ anly 14.05.17 14:52, Последний раз изменено 17.05.17 23:04 (moose)
Но все же что лучше и в каких ситуациях?

В каких ситуациях? Вы не указали, а именно от этого все и зависит.

#9