2010-06-30 4 views
2

Pour C# dans VS2005, l'appel this() dans une classe héritée provoque l'exécution du constructeur de base?C# dans VS2005: est-ce que this() exécutera le code du constructeur de base pour une classe héritée?

EDIT: Comment éviter d'avoir à réécrire les affectations x et y? Remarque, je ne pas voulez le constructeur MyObject (num num) pour exécuter le constructeur 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; 
} 
+0

Vous devez appeler le constructeur de base, peut-être que l'héritage n'est pas la solution dont vous avez besoin. – PostMan

Répondre

1

Je crois que c'est la syntaxe que vous recherchez:

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

} 

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

} 

la base d'appel() le fera exécuter le constructeur de base avant que le constructeur actuel.

+0

Intéressant. Je réponds d'abord, puis vous répondez la même chose, et tout à coup, ma réponse a un vote négatif. Gee, je me demande ce qui se passe ici. –

+1

Que vous appeliez ou non 'base()', il sera toujours exécuté avant le constructeur de la classe dérivée, en supposant que la classe de base possède un constructeur sans paramètre * et * vous n'appelez pas explicitement un constructeur de base paramétré. Dans tous les cas, la classe de base va être construite avant la classe dérivée. –

+0

Cette réponse n'est pas fausse, mais inutile. Et @Esteban, je suis celui qui vous a voté. –

5

base() sera appelé implicitement par le premier constructeur à courir dans la classe dérivée:

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

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

équivaut à:

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

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

    } 
} 

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

    } 

    MyClass() : this(null) 
    { 

    } 
} 

MyClass() : this(null) appellera base via MyClass(int? id)

Ou vous pourriez l'échanger et faire MyClass(int? id) : this() et MyClass() : base() de toute façon, le constructeur de base sera appelé.

Le constructeur paramater-moins (si elle existe) est appelée si rien n'est spécifié, ou une erreur du compilateur résultera (si vous avez seulement un constructeur de base avec des paramètres)

2

Le constructeur de base parameterless sera appelée implicitement sauf si vous appelez explicitement un constructeur de base paramétré.

Si vous avez

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

Il ne diffère pas de dire

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

Donc, si vous avez un constructeur paramétrés pour Foo, base() sera appelé peu importe ce que vous faites avec this()moins vous avez également un constructeur paramétré pour Base que vous appelez explicitement.

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 */ 
} 

De toute façon, la classe de base va s'instancié premier soit par le constructeur parameterless (implicitement ou explicitement) ou par le constructeur paramétrés (explicitement).

0

Vous essayez de ne pas instancier votre classe de base à tout moment? Ce n'est pas possible; vous devez appeler explicitement ou implicitement un constructeur de base, que vous réécriviez ou non les assignations de champ.

Il est sonne comme ce n'est pas le comportement que vous êtes à la recherche (parce qu'il appelle base() implicitement, mais là encore, il en va de votre code), mais cela vous permet d'économiser la réécriture:

public class MyObject : MyParentObject { 

int x; 
int y; 
int z; 

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

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

Pourquoi spécifiquement voulez-vous éviter d'appeler le constructeur de la classe de base?