문제

C#,가 있는 경우에는 상속받은 클래스는 기본 생성자,나를 명시적으로 호출한 기본 클래스의 생성자 또는 그것은 암시적으로 호출?

class BaseClass
{
    public BaseClass()
    {
        // ... some code
    }
}
class MyClass : BaseClass
{
    public MyClass() // Do I need to put ": base()" here or is it implied?
    {
        // ... some code
    }
}
도움이 되었습니까?

해결책

당신이 필요하지 않습을 명시적으로 호출하여 기초 생성자,그것이 암시적으로 호출됩니다.

확장의 예금 및 콘솔 응용 프로그램을 만들고 확인할 수 있습니다 이 행동은 자신을 위해:

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.");
        }
    }
}

다른 팁

그것은 묵시적,제공 그것은 매개 변수가 없는.이 때문에 당신 를 구현할 필요가 생성자 하는 값, 참조 코드는 아래 예를 들어:

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!
    }
}

그것은 묵시적으로 기본 매개 변수가 없는 생성자,그러나 그것은 필요한 기본값에서는 현재 등급:

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"
    }
}

그것은 묵시적으로 사용됩니다.

파생 클래스에 내장되어 기본 클래스입니다.당신이 그것에 대하여 생각하는 경우,베이스 객체를 인스턴스화하기 전에 메모리에서 파생된 클래스가 추가될 수 있습니다.그래서 기본 개체가 만들어가는 길에 만들기 유사한 모델이다.그래서,당신은하지 않는 생성자를 호출.

AFAIK,당신을 호출해야의 기본 생성자 전달해야 하는 경우 어떤 값이다.

당신이 필요하지 않 통화의 기본 생성자를 명시적으로 그것이 암시적으로 호출하지만,때때로 당신은 필요한 매개 변수를 전달에서 생성자 하는 경우에 당신이 무언가를 할 수 있 다음과 같:

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();
        }
    }
}

참고:만약 누군가가 알고있는 더 나은 솔루션을 주시기 바랍 알려줍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top