Как я могу препятствовать тому, чтобы основной конструктор был вызван наследником в C#?

Еще один вариант - использовать PIVOT совместно с Row_Number()

. Пример

Select *
 From  (
        Select A.ID
              ,A.[first_name]
              ,A.[last_name]
              ,Item = concat('Frosting ',Row_Number() over (Partition By B.ID Order by Line) )
              ,Value = frosting
         From Customer A
         Join Orders B on A.id=B.id
         Where batter_code in (450,360)
       ) src
 Pivot (max(Value) for Item in ([Frosting 1],[Frosting 2],[Frosting 3]) )pvt

.

ID  first_name  last_name   Frosting 1  Frosting 2  Frosting 3
101 Jane        Smith       Orange      Cherry      NULL
234 Jon         Smith       chocolate   NULL        NULL
23
задан Jakub Šturc 1 October 2008 в 19:36
поделиться

9 ответов

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

21
ответ дан 29 November 2019 в 00:40
поделиться

Существует способ создать объект, не звоня никакой конструкторы экземпляра.

перед продолжением, быть очень уверенными, что Вы хотите сделать это этот путь. 99% времени это - неверное решение.

Это - то, как Вы делаете это:

FormatterServices.GetUninitializedObject(typeof(MyClass));

Вызов это вместо конструктора объекта. Это создаст и возвратит Вас экземпляр, не вызывая конструкторов или полевых инициализаторов.

при десериализации объекта в WCF это использует этот метод для создания объекта. Когда это происходит, конструкторы, и даже полевые инициализаторы не выполняются.

58
ответ дан 29 November 2019 в 00:40
поделиться

По крайней мере 1 ctor нужно назвать. Единственным путем вокруг этого, который я вижу, является включение. Имейте класс внутри или ссылку на другой класс.

6
ответ дан 29 November 2019 в 00:40
поделиться

Если то, что Вы хотите, к не вызов любой из двух конструкторов базового класса, это не может быть сделано.

конструкторы класса C# должны вызвать конструкторов базового класса. Если Вы не называете тот явно, , основа () подразумевается . В Вашем примере, если Вы не определяете, каким конструктором базового класса звонить, он совпадает с:

public BaseClassProxy : BaseClass
{
    public BaseClassProxy() : base() { }
}

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

public BaseClassProxy : BaseClass
{
    public BaseClassProxy() : base(someIntValue) { }
}

Так или иначе, один из два будет быть названным, явно или неявно.

5
ответ дан 29 November 2019 в 00:40
поделиться

Я не полагаю, что можно обойти вызов конструктора. Но Вы могли сделать что-то вроде этого:

public class BaseClass : SomeOtherBase 
{
   public BaseClass() {}

   protected virtual void Setup()
   {
   }
}

public BaseClassProxy : BaseClass
{
   bool _fakeOut;
   protected BaseClassProxy(bool fakeOut)
   {
        _fakeOut = fakeOut;
        Setup();
   }

   public override void Setup()
   {
       if(_fakeOut)
       {
            base.Setup();
       }
       //Your other constructor code
   }
} 
4
ответ дан 29 November 2019 в 00:40
поделиться

При создании объекта BaseClassProxy, он ДОЛЖЕН создать экземпляр, он - базовый класс, таким образом, необходимо вызвать конструктора базового класса, чем Вы можете doo быть выбрать который звонить, как:

public BaseClassProxy (bool fakeOut) : base (10) {}

Для вызова второго конструктора вместо первого

1
ответ дан 29 November 2019 в 00:40
поделиться

Я боюсь, что не конструктор вызова основы не является опцией.

1
ответ дан 29 November 2019 в 00:40
поделиться

Я закончил тем, что делал что-то вроде этого:

public class BaseClassProxy : BaseClass 
{
   public BaseClass BaseClass { get; private set; }

   public virtual int MethodINeedToOverride(){}
   public virtual string PropertyINeedToOverride() { get; protected set; }
}

Это получило меня вокруг некоторых плохих методов базового класса.

0
ответ дан 29 November 2019 в 00:40
поделиться

Вот мое решение проблемы

using System;

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Child().Test);
    }

    public class Child : Parent {
        public Child() : base(false) {
            //No Parent Constructor called
        }
    }
    public class Parent {
        public int Test {get;set;}
        public Parent()
        {
            Test = 5;
        }
        public Parent(bool NoBase){
            //Don't do anything
        }
    }
}

А простое изящное решение. Можно изменить его согласно потребности.

0
ответ дан 29 November 2019 в 00:40
поделиться
Другие вопросы по тегам:

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