Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В С++ - friend, а в С# - что? аналог friend в C# 
:(
    Опции темы
Skynin
Дата 13.8.2009, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 0
Всего: 10



Цитата

А во втором есть переменная с типом первого класса. Но есть в первом классе переменная Идентификатор, которая должна быть в режиме только для чтения. Везде. За исключением второго класса, откуда она устанавливается, предварительно найденная в базе данных. Как на С++ такое делать знаю, а вот как на С# - нет...
...
Вот мне интересно, неужели в Шарпее вообще невозможно дать доступ к приватной части класса для "узкого круга" процедур? 

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

Код


    public class ClassA
    {
        public int anyF {get; private set;}
        public void setAnyF(object sender, int newVal) {
            if (sender is ClassB) anyF = newVal;
            
            throw new Exception(); // чтобы отловить неправильное присваивание. Или закомментировать если не нужно
        }
    }
    
    public class ClassB {
...
        ClassA clA;
...        
        clA.setAnyF(this,12);
...
    }


Цитата

Эх, забыть... Это очень интересная и полезная вещь в С++...

Малополезная вещь при грамотном проектировании.
Решение "в лоб" - выше.

Это сообщение отредактировал(а) Skynin - 13.8.2009, 21:19
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
PashaPash
Дата 13.8.2009, 21:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Skynin, решение влоб ломается вот так
Код

clA.setAnyF(new ClassB(), 12);

Да и хочется же проверки на уровне синтаксиса. smile

bvn13, вообще сама идея выставлять переменную из другого класса - это как-то не комильфо. Вариант - интерфейс с read only проперти. Что-то типа
Код

class CL1
{
    private CL2 class2 = new CL2();

    public void ChangeProperty()
    {
        this.class2.SomeProperty = "ну вот что-то такое";
    }

    public ICL2 Class2Instance
    {
        get
        {
            return this.class2;
        }
    }
}

interface ICL2
{
    string SomeProperty { get; }
}

class CL2 : ICL2
{
    public string SomeProperty { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        CL1 c1 = new CL1();
        c1.ChangeProperty();
        c1.Class2Instance.SomeProperty = ""; // compilation error
    }
}



--------------------
PM MAIL WWW   Вверх
nerezus
Дата 13.8.2009, 22:13 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



Цитата

В С++ - friend, а в С# - что? аналог friend в C#
 А в C# отсутствие костылей и знание ООП.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Bestoloch
Дата 14.8.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 29.6.2009

Репутация: нет
Всего: нет



На сколько я понимаю абстрагирование слоев это best practice.
В данном случае есть слой работы с базой данных, в работу которого должен вмешаться класс из другого слоя, зачем?
PM MAIL   Вверх
Skynin
Дата 14.8.2009, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 0
Всего: 10



Цитата

решение влоб ломается вот таккод C#

В C# почти все ломается рефлексией. Так что теперь, и не жить?

Задача то - избавиться от непреднамеренно некорректного использования метода присваивания.
А не защита от "хакера".

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

Но если быть параноиком, то обсуждение этого плевого вопроса потянет не на одну страницу  smile 

Цитата

Да и хочется же проверки на уровне синтаксиса.


тогда, проверка во время компиляции
Код

public void setAnyF(ClassB sender, int newVal) {
public void setAnyF(ClassC sender, int newVal) {
public void setAnyF(ClassD sender, int newVal) {


где ClassB, ClassC, ClassD - дружественные к ClassA



Это сообщение отредактировал(а) Skynin - 14.8.2009, 10:48
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
PashaPash
Дата 14.8.2009, 13:03 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Цитата(Skynin @  14.8.2009,  10:28 Найти цитируемый пост)
В C# почти все ломается рефлексией. Так что теперь, и не жить?

Задача то - избавиться от непреднамеренно некорректного использования метода присваивания.
А не защита от "хакера".

IMHO, Защита на уровне синтаксиса не должна ломаться на уровне синтаксиса. Защита на уровне кода не должна ломаться вписыванием не-рефлекш кода. Даже если это защита от дурака, а не от хакера. Любой дурак при попытке вызвать метод неоттуда впишет new ClassB, тупо проверить, а вдруг заработает -  и ведь заработает smile

Ну и в целом система с sender напоминает "скажи пароль - пароль - проходи" smile

Цитата(Skynin @  14.8.2009,  10:28 Найти цитируемый пост)

Задача то - избавиться от непреднамеренно некорректного использования метода присваивания.

Задача - избавится от непреднамеренно некорректного использования метода присваивания без дополнительных телодвижений со стороны используещего. sender - это уже ограничение - нельзя вызвать из статического класса/метода. И повышение coupling - в случае friend или интерфейса реализация ничего не знает о классе-пользователе, в случае sender - знает более чем достаточно. и даже может вызвать в нем что-нибудь - снаружи ж не видно. Для таких случаев есть Interface-Segregation Principle.




--------------------
PM MAIL WWW   Вверх
ДобренькийПапаша
Дата 14.8.2009, 14:22 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



Цитата

Ну и в целом система с sender напоминает "скажи пароль - пароль - проходи" 


Так и не проще ли воспользоваться свойствами?


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0901 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.