В C# необходимо ли вызвать основного конструктора?

Изменение стандартной системы python по умолчанию приведет к разрыву некоторых приложений, зависящих от python2.

Вы можете псевдонизировать команды в большинстве оболочек, Mac OS X использует bash по умолчанию, если вы также поместите это в свою команду ~/.bash_profile:

alias python='python3'

python теперь относится к python3. Если вы хотите использовать оригинальный python (который ссылается на python2 ), вы можете избежать псевдонима, т. Е. \python запустит python2 , оставив псевдоним нетронутым)

Если вы чаще запускаете интерпретаторы (I do) , лучше:

alias 2='python2'
alias 3='python3'

Совет: вместо выполнения:

#!/usr/bin/env python

use:

#!/usr/bin/env python3

система будет использовать python3 для запуска исполняемых файлов python .

51
задан Servy 14 June 2013 в 07:00
поделиться

7 ответов

Вы не должны явно вызывать основного конструктора, это неявно назовут.

Расширяют Ваш пример немного и создают Консольное приложение, и можно проверить это поведение для себя:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass foo = new MyClass();

            Console.ReadLine();
        }
    }

    class BaseClass
    {
        public BaseClass()
        {
            Console.WriteLine("BaseClass constructor called.");
        }
    }

    class MyClass : BaseClass
    {
        public MyClass()
        {
            Console.WriteLine("MyClass constructor called.");
        }
    }
}
57
ответ дан Ian Nelson 7 November 2019 в 10:05
поделиться

Это подразумевается, если это без параметров. Это вызвано тем, что Вы потребность реализовать конструкторов, которые принимают значения , посмотрите код ниже для примера:

public class SuperClassEmptyCtor
{
    public SuperClassEmptyCtor()
    {
        // Default Ctor
    }
}

public class SubClassA : SuperClassEmptyCtor
{
    // No Ctor's this is fine since we have
    // a default (empty ctor in the base)
}

public class SuperClassCtor
{
    public SuperClassCtor(string value)
    {
        // Default Ctor
    }
}

public class SubClassB : SuperClassCtor
{
    // This fails because we need to satisfy
    // the ctor for the base class.
}

public class SubClassC : SuperClassCtor
{
    public SubClassC(string value) : base(value)
    {
        // make it easy and pipe the params
        // straight to the base!
    }
}
29
ответ дан Rob Cooper 7 November 2019 в 10:05
поделиться

Это подразумевается для основных конструкторов без параметров, но это необходимо для значений по умолчанию в текущем классе:

public class BaseClass {
    protected string X;

    public BaseClass() {
        this.X = "Foo";
    }
}

public class MyClass : BaseClass
{
    public MyClass() 
        // no ref to base needed
    {
        // initialise stuff
        this.X = "bar";
    }

    public MyClass(int param1, string param2)
        :this() // This is needed to hit the parameterless ..ctor
    {
         // this.X will be "bar"
    }

    public MyClass(string param1, int param2)
        // :base() // can be implied
    {
         // this.X will be "foo"
    }
}
8
ответ дан Keith 7 November 2019 в 10:05
поделиться

Это подразумевается.

6
ответ дан John Downey 7 November 2019 в 10:05
поделиться

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

4
ответ дан Tom Welch 7 November 2019 в 10:05
поделиться

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

0
ответ дан Lars Mæhlum 7 November 2019 в 10:05
поделиться

Вы, которых don’t должны вызвать основным конструктором явно, это неявно назовут, но иногда Вы должны передать параметры конструктору в этом случае, можно сделать что-то как:

using System;
namespace StackOverflow.Examples
{
    class Program
    {
        static void Main(string[] args)
        {
            NewClass foo = new NewClass("parameter1","parameter2");
            Console.WriteLine(foo.GetUpperParameter());
            Console.ReadKey();
        }
    }

    interface IClass
    {
        string GetUpperParameter();
    }

    class BaseClass : IClass
    {
        private string parameter;
        public BaseClass (string someParameter)
        {
            this.parameter = someParameter;
        }

        public string GetUpperParameter()
        {
            return this.parameter.ToUpper();
        }
    }

    class NewClass : IClass
    {
        private BaseClass internalClass;
        private string newParameter;

        public NewClass (string someParameter, string newParameter)
        {
            this.internalClass = new BaseClass(someParameter);
            this.newParameter = newParameter;
        }

        public string GetUpperParameter()
        {
            return this.internalClass.GetUpperParameter() + this.newParameter.ToUpper();
        }
    }
}

Примечание: Если кто-то знает, что лучшее решение говорит мне.

-3
ответ дан jl23x 7 November 2019 в 10:05
поделиться
Другие вопросы по тегам:

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