Опять про видимость в C# (ЗАКРЫТО)

kruzer25

Теперь уже базовый класс не умеет работать с защищёнными конструкторами дочерних:
using System;
using System.Collections.Generic;
using System.Text;

namespace Test {

abstract class A {

public static A GetB {
return new B;
}

}

class B : A {

protected B { }
}

class Program {
static void Main(string[] args) {
}
}
}

В документации ничего не нашёл...

kokoc88

Теперь уже базовый класс не умеет работать с защищёнными конструкторами дочерних
Программируй на Java. Там область видимости как раз треугольничком. :grin:

pitrik2

Теперь уже базовый класс не умеет работать с защищёнными конструкторами дочерних:
вроде ты не должен этого хотеть
имхо, как то аморально чтобы базовый класс чтонить знал про своих ребенков
вместо этого есть всякие там паттерны, типа фабрик

kruzer25

вместо этого есть всякие там паттерны, типа фабрик
Тогда тоже придётся делать публичные конструкторы, а этого как-то не хочется.
Какой тогда смысл в protected-конструкторах, чем они отличаются от private?

pitrik2

Тогда тоже придётся делать публичные конструкторы, а этого как-то не хочется.
в джаве для этого есть пакадж локал, в сишарп подобного нету?

Helga87

есть. internal называется

kruzer25

в джаве для этого есть пакадж локал, в сишарп подобного нету?
А плодить пространства имён на каждое дерево классов - хороший тон?
Кроме того, сейчас эта фабрика у меня сама по себе internal, видна только внутри пространства имён, и никто снаружи её позвать не может. Хочется ещё и чтобы конструкторы экземпляров классов, которые она создаёт, никому, кроме фабрики доступны не были.
Твой вариант такой возможности, насколько я понимаю, не даст. Если выносить фабрику и классы создаваемых ей экземпляров в отдельное пространство имён - фабрику сможет звать кто угодно.

pitrik2

А плодить пространства имён на каждое дерево классов - хороший тон?
в джаве это нормуль
частенько даже 2 пространства имен плодятся: для интерфейсов и для реализаций

kruzer25

А что насчёт второго вопроса?

pitrik2

ты хочешь чтобы конструктор могла вызывать только фабрика и больше никто другой?
в джаве для этого есть интернал классы

public class Factory {
A getB {
return new B;
}

private static class B extends A{
....
}
}

если хочешь чтобы ктото другой все же мог, то делаешь пакадж локал

package a;
class A{}
interface AFactory{
A getB;
}

package a.impl;
interface AFactoryImpl implements AFactory{
@Override
A getB {return new B;}
}
class B{
B {}
}

kruzer25

в джаве для этого есть интернал классы
Точно - о вложенных классах я и не подумал :)
Оставить комментарий
Имя или ник:
Комментарий: