2010-01-14 10 views
10

¿Cuál es la forma más fácil de hacer que C# no crea una instancia a menos que herede?¿La manera más fácil de hacer que C# no instanciar una clase a menos que herede?

Suena raro pero no quiero explicar el por qué. Tengo una clase base y dos clases que la heredan. Quiero usar solo la clase derivada y no la base. La clase derivada no tiene funciones adicionales. ¿Cuál es la forma más fácil de NO permitirme escribir una nueva BaseClass()? entonces no lo uso accidentalmente? Tengo funciones que operan en la clase base y no en las derivadas.

+5

Me encantan las preguntas en las que una persona describe una característica existente a la letra (en este caso clases abstractas). Son preguntas tan pulcras y ordenadas con respuestas tan claras que me satisfacen enormemente. – KingNestor

+0

jaja KingNestor –

+0

resulta que alguien me votó negativamente también. Extraño. –

Respuesta

43

Haz que la clase sea una clase base abstract.

abstract class Person { } 

class Programmer : Person { } 

var person = new Person();   // compile time error 
var programmer = new Programmer(); // ok 
+3

Ni siquiera puedes ver el nombre de la clase en la lista intellisense al intentar crear una instancia que es impresionante para la conciencia :) – Tarik

+1

+1 @Dockers (15char) –

5

¿Puede la clase base ser abstracta? Eso lo haría.

5
public abstract class BaseClass { 
... 
} 
5

en lugar del habitual:

"public Class MyClass"

hacen

"public abstract Class MyClass" 
1

Hacer el constructor de BaseClass protegida:

public class BaseClass { 

    protected BaseClass() 
    { 
     // DO SOMETHING 
    } 

} 


public class Derived : BaseClass { 

    public Derived() {} 
} 
+1

Solo si no puede hacer la clase base abstracta por alguna razón extraña . –

+0

No haría esto. – Finglas

+0

Hay mejores soluciones arriba. – David

1

La forma en que describe su necesidad, haciendo que su clase abstract es el camino a seguir. Se le impide crear una instancia de la clase base y le permitirá llamar a las funciones en . Esto también le permitirá marcar funciones y propiedades como abstract y forzar las clases heredadas para implementarlas.

Si no necesita compartir el código, una interfaz sería una buena opción. Le permite implementarlo de una manera muy similar a una clase abstarct y convertir sus implementaciones en ella.

Espero que esto agregue algo de valor.

0

Use un constructor protegido para la clase base

+1

Esta no es una solución válida ... el resumen es el camino correcto. – David

Cuestiones relacionadas