2010-03-31 10 views
8

que tienen una estructura de clases como¿Por qué el constructor base() no es necesario?

abstract class Animal { 
    public Animal(){ 
    //init stuff.. 
    } 
} 

class Cat : Animal { 
    public Cat(bool is_keyboard) : base() //NOTE here 
    { 
    //other init stuff 
    } 
} 

Ahora bien, mirar la línea señalado. Si elimina : base(), se compilará sin error.

¿Por qué es esto? ¿Hay alguna forma de desactivar este comportamiento?

Respuesta

7

Hay un : base() implícita si no se agrega ninguna otra cosa (cualquier : base(...) o : this(...)). Para forzarlo a ser explícito, agregue un parámetro al constructor (es) base. Entonces no puede ser implícito.

Por ejemplo:

public Animal(string name) {...} 
+1

fresca, se aprende algo todos los días ... Siempre has puesto explícitamente base(), probablemente seguirá haciéndolo porque el número de desarrolladores se dan cuenta de que hay es una llamada implícita a eso? – slugster

+0

Además, encontré el ingenioso artículo de Skeet que me lo contó al respecto: http://www.yoda.arachsys.com/csharp/constructors.html – Earlz

+0

@slugster, no me di cuenta ... así que sí. – Earlz

0

¿Por qué es esto?

Esto article lo explica.

¿Hay alguna manera de deshabilitar este comportamiento ?

Nope. Lo siento (pero ... Ver respuesta marca para una solución:)

1

17.10.4 Default Constructors:

Si una clase contiene ningún caso declaraciones del constructor, una instancia de constructor por defecto es automáticamente siempre. 2 El constructor predeterminado simplemente invoca el constructor sin parámetros de la clase base directa. 3 Si la clase base directa no tiene tiene un constructor de instancias sin parámetros accesible, se produce un error en tiempo de compilación. 4 Si la clase es abstracta, entonces la accesibilidad declarada para el constructor predeterminado está protegida. 5 De lo contrario, la accesibilidad declarada por el constructor por defecto es pública

+1

Si bien es cierto, esa es la sección incorrecta para lo que ocurre cuando se elimina ': base()'. Esa sección dice qué sucede si se elimina todo el constructor. –

Cuestiones relacionadas