2011-06-08 20 views
17
abstract class CAbstract 
{ 
    private string mParam1; 
    public CAbstract(string param1) 
    { 
     mParam1 = param1; 
    } 
} 

class CBase : CAbstract 
{ 
} 

Para la clase CBase, debe inicializarse proporcionando el parámetro, entonces, ¿cómo deshabilitar el constructor sin parámetros para la clase CBase?Cómo deshabilitar el constructor sin parámetros en C#

+0

posible duplicado de [Impedir el uso del constructor por defecto] (http://stackoverflow.com/questions/2875581/prevent-usage-of-default-constructor) –

+0

@Sven Tal vez esta clase represente la letra "C" en alguna aplicación relacionada con el procesamiento del lenguaje: D – AaronLS

Respuesta

23

Si se define un constructor parametrizado en CBase, no hay constructor por defecto. No necesitas hacer nada especial.

Si su intención es que todas las clases derivadas de CAbstract implementen un constructor parametrizado, eso no es algo que pueda (limpiamente) lograr. Los tipos derivados tienen libertad para proporcionar sus propios miembros, incluidas las sobrecargas de los constructores.

Lo único que requiere de ellos es que si CAbstract solo expone un constructor parametrizado, los constructores de los tipos derivados deben invocarlo directamente.

class CDerived : CAbstract 
{ 
    public CDerived() : base("some default argument") { } 
    public CDerived(string arg) : base(arg) { } 
} 
+1

+1 para el bit adicional en restringir clases derivadas. Es por eso que escribir buenas librerías OOP es difícil. – user7116

+0

OP indica que el constructor predeterminado no es necesario. ¿Por qué muestras el constructor predeterminado en tu código? –

+0

@Alex, la pregunta es ambigua, al menos para mí, de ahí mi segundo y tercer párrafo y el fragmento de código que lo acompaña. No puedo decir lo que quiere, pero mi * sentimiento * es que lo que él quiere es algo que el lenguaje no proporciona. –

13

Para deshabilitar el constructor predeterminado, debe proporcionar un constructor no predeterminado.

El código que pegó no es compilable. Para que sea compilables se podría hacer algo como esto:

class CBase : CAbstract 
{ 
    public CBase(string param1) 
     : base(param1) 
    { 
    } 
} 
-3

Por favor, corríjanme si me equivoco, pero creo que he logrado ese objetivo con este código:

//only for forbiding the calls of constructors without parameters on derived classes 
public class UnconstructableWithoutArguments 
{ 
    private UnconstructableWithoutArguments() 
    { 
    } 

    public UnconstructableWithoutArguments(params object[] list) 
    { 
    } 
} 
+3

Esto no evita que los niños proporcionen constructores sin parámetros, solo obliga a los niños a invocar explícitamente el constructor con parámetros base. –

Cuestiones relacionadas