Наследуемый только в блоке в C#

ОТВЕТ:

Базовая ошибка в запросе SQL: следует добавить максимум около возраста:

    >>> requete_sql = """ 
SELECT c.id, max(c.age), mean(v.vitesse) 
FROM  cyclistes as c , voyages as v 
WHERE c.id == v.id GROUP BY c.id """
>>> spark.sql(requete_sql)
12
задан Joel Coehoorn 10 March 2009 в 13:56
поделиться

6 ответов

16
ответ дан 2 December 2019 в 03:49
поделиться

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

public class Foo
{
    internal Foo()
    {
    }

    public Foo Create()
    {
        return new Foo();
    }
}

Вот альтернатива, которая позволяет Вам новый класс во внешних блоках

public sealed class Foo : FooBase
{

}

public class FooBase
{
    internal FooBase() { }
}

Один вопрос, который Вы могли бы задать сами, однако, состоит точно в том, почему Вы хотите, чтобы класс был изолирован. Иногда это неизбежно, но я видел sealed ключевым словом злоупотребляют так часто, что я думал, что подниму его. Часто, разработчики изолируют классы, потому что они являются защитными из своего кода. Большую часть времени, если класс хорошо разработан, он не должен быть изолирован.

14
ответ дан 2 December 2019 в 03:49
поделиться

Если Ваш класс абстрактен, существует очень простой способ сделать это:

public abstract class Foo {
    internal abstract void DoNothing();
    // ... other members
}

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

5
ответ дан 2 December 2019 в 03:49
поделиться

Единственным путем я могу думать, должен был бы использовать общедоступную обертку на внутреннем классе, вероятно, с единым интерфейсом:

public interface IFoo
{
}

internal class Foo : IFoo
{
}

public sealed class PublicFoo : IFoo
{
    private Foo m_Foo = new Foo();
}
1
ответ дан 2 December 2019 в 03:49
поделиться

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

public class MyClass{
  public MyClass(){
    if(this.GetType().Assembly != typeof(MyClass).Assembly){
        throw new Exception("Can't derive from this type!");
  }
}

Проверенный это. Кажется, работает. Единственная проблема состоит в том, что, если кто-то не читает документацию, проблема известна во времени выполнения.

1
ответ дан 2 December 2019 в 03:49
поделиться

Нет. На самом языке C# нет такого условия. Однако обходные решения - как предложили другие здесь - могут быть достаточными.

0
ответ дан 2 December 2019 в 03:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: