C # в VS2005: будет ли this () выполнять базовый код конструктора для унаследованного класса? - PullRequest
2 голосов
/ 30 июня 2010

Для C # в VS2005 вызовет ли this() в унаследованном классе выполнение базового конструктора?

РЕДАКТИРОВАТЬ: Как я могу избежать переписать назначения x и y? Обратите внимание, я не хочу, чтобы конструктор MyObject (int num) выполнил конструктор base ().

public class MyObject : MyParentObject { 

int x; 
int y; 
int z; 

public MyObject() { 
    x = 5; 
    y = 10; 
} 

public MyObject(int num) : base(num) { 
    x = 5; 
    y = 10; 
    z = num; 
} 

Ответы [ 5 ]

5 голосов
/ 30 июня 2010

base() будет вызван неявно первым конструктором для выполнения в производном классе:

public MyObject() {
    x = 5;
    y = 10;
}

public MyObject(int setZ) : this() {
    z = setZ;
}

эквивалентно:

public MyObject() : base() {
    x = 5;
    y = 10;
}

public MyObject(int setZ) : this() {
    z = setZ;
}
2 голосов
/ 30 июня 2010

Безпараметрический базовый конструктор будет вызываться неявно, если вы не вызовете явно параметризованный базовый конструктор.

Если у вас есть

class Base { }
class Foo : Base { public Foo() { } }

Это не отличается от высказывания

class Foo : Base { public Foo() : base() { } }

Таким образом, если у вас есть параметризованный конструктор для Foo, base() будет вызываться независимо от того, что вы делаете с this() , если только у вас также нет параметризованного конструктора для Base, который вы явно вызываете.

class Base
{
    public Base() { }
    public Base(int bar) { }
}

class Foo : Base
{
    public Foo() : base() { }
    public Foo(int bar) : base(bar) { }
    // also legal: 
    // public Foo() : base(1) { }
    // public Foo(int bar) : base(1) { }
    // public Foo(int bar) : base() { }
    // public Foo(int bar) { } /* uses implicit call to base() */
    // public Foo() { } /* ditto */
}

В любом случае, базовый класс будет создан сначала либо через конструктор без параметров (неявно или явно), либо через конструктор с параметрами (явно).

1 голос
/ 30 июня 2010
class BaseClass
{
   BaseClass()
   {

   }
}

class MyClass : BaseClass
{
   MyClass(int? id) : base()
   {

   }

   MyClass() : this(null)
   {

   }
}

MyClass() : this(null) вызовет базу через MyClass(int? id)

Или вы можете поменять его местами и сделать MyClass(int? id) : this() и MyClass() : base() в любом случае, будет вызван базовый конструктор.

Конструктор без параметров (если он есть) вызывается, если ничего не указано, иначе возникнет ошибка компилятора (если у вас только базовый конструктор с параметрами)

1 голос
/ 30 июня 2010

Я считаю, что это синтаксис, который вы ищете:

    class MainClass
{
    MainClass()
    {
        //do something
    }

}

class MyClass : MainClass
{
    MyClass()
        : base()
    {
        // do something else
    }

}

Вызов base () заставит его запустить конструктор base перед текущим конструктором.

0 голосов
/ 30 июня 2010

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

Звучит так, как будто это не то поведение, которое вы ищете (потому что оно вызывает base() неявно, ноопять же, как и ваш код), но это спасает вас от переписывания:

public class MyObject : MyParentObject { 

int x; 
int y; 
int z; 

public MyObject() { 
    x = 5; 
    y = 10; 
} 

public MyObject(int num) : this() { 
    z = num; 
}

Почему именно вы хотите избежать вызова конструктора базового класса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...