Когда вы создаете экземпляр класса, создаются все классы в иерархии наследования, начиная с самого верхнего Parent до самого нижнего потомка, останавливаясь на том типе, который вы создали.Поэтому, если вы создаете экземпляр System.Text.StringBuilder (), сначала вы вызываете конструктор по умолчанию для System.Object, затем StringBuilder ().Вы можете использовать ключевое слово base для вызова другого конструктора (с равным или меньшим количеством параметров), но не с большим количеством параметров.Если вы не укажете base, вызывается конструктор по умолчанию, поэтому причина, по которой это происходит с вами.Вы также можете использовать ключевое слово base в контексте метода экземпляра для вызова базовых реализаций, например, в случае шаблона декоратора.Если вы не хотите вызывать частные конструкторы базового класса, вам следует установить дочерние элементы с закрытыми конструкторами по умолчанию, а также явно вызывать base (params) для других ваших конструкторов.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class ProcessCaller
{
static void Main()
{
MyDerived md1 = new MyDerived(1);
object o = new System.Text.StringBuilder();//This will implicitly instantiate the classes in the inheritance hierarchy: object, then stringbuilder
}
}
public class MyBase
{
int num;
public MyBase()
{
Console.WriteLine("in MyBase()");
}
public MyBase(int i )
{
num = i;
Console.WriteLine("in MyBase(int i)");
}
public virtual int GetNum()
{
return num;
}
}
public class MyDerived: MyBase
{
//set private constructor. base(i) here makes no sense cause you have no params
private MyDerived()
{
}
// Without specifying base(i), this constructor would call MyBase.MyBase()
public MyDerived(int i) : base(i)
{
}
public override int GetNum()
{
return base.GetNum();//here we use base within an instance method to call the base class implementation.
}
}
}