c# - usar - que es una interfaz en programacion orientada a objetos
¿Por qué no se nos permite especificar un constructor en una interfaz? (7)
¿Cómo llamarías al constructor? Cuando utiliza interfaces, normalmente pasa una instancia de la interfaz (o más bien, una referencia). También tenga en cuenta que si una clase implementa una interfaz, una clase derivada hereda esa interfaz, pero puede no tener el mismo conjunto de constructores.
Ahora puedo ver el uso de lo que llamo interfaces estáticas para especificar constructores y otros miembros esencialmente estáticos para usar en métodos genéricos. Ver la publicación de mi blog sobre la idea para obtener más información.
Posible duplicado:
Interfaz que define una firma de constructor
Sé que no se puede especificar un constructor en una interfaz en .Net, pero ¿por qué no?
Sería realmente útil para mi proyecto actual poder especificar que un ''motor'' debe pasarse con el constructor, pero como puedo, debo bastar con un comentario XML en la clase.
Además de las otras explicaciones dadas aquí, tendrías que inventar una nueva sintaxis para llamarlas de todos modos, ya que si tienes dos o más implementaciones en el alcance en la línea:
Dim x as new IDoStuff()
¿Cuánta implementación se llama?
Debido a que no se puede crear una instancia de una interfaz, entonces una construcción tiene sentido.
Entre todas las otras razones ya publicadas, tenga en cuenta que una clase puede implementar fácilmente varias interfaces; ¿Qué constructor debería usarse entonces?
No, no puede tener constructores en las interfaces por las razones que se han publicado. Sin embargo, puedes en clases abstractas. Digamos, por ejemplo, que tienes esta clase base.
public abstract class ClassOne
{
protected int _x;
protected string _s;
public ClassOne(int x, string s)
{
_x = x;
_s = s;
}
}
Observe que no hay constructores que no tomen ningún argumento (constructor predeterminado) lo que significa que cualquier clase que herede de ClassOne debe llamar al constructor que tiene 2 argumentos.
Entonces esto no es válido y no compilará.
public class ClassTwo : ClassOne
{
public ClassTwo()
{ }
}
Sin embargo, esto es válido y compilará.
public class ClassTwo : ClassOne
{
public ClassTwo(int x, string s) : base(x, s)
{ }
}
Me gustaría señalar aquí que en C # solo se puede heredar de una clase base. Lo que significa que esta puede no ser la solución correcta para una situación particular, pero es algo en lo que pensar.
Tony.
Otras respuestas ya han señalado por qué no tiene sentido tener una declaración de constructor en una interfaz. Pero de su pregunta, supongo que probablemente esté buscando el patrón abstracto de fábrica .
Para dar un ejemplo basado en su pregunta: usted dice que le gustaría declarar de alguna manera que un ''motor'' debe pasarse al constructor. Puede hacerlo declarando una interfaz separada para un servicio de construcción como este:
public interface IGadgetFactory
{
IGadget CreateGadget(Engine engine);
}
Cualquier código que debe crear instancias IGadget
puede usar una instancia IGadgetFactory
lugar de llamar a cualquier constructor directamente.
Porque una interfaz describe el comportamiento. Los constructores no son comportamiento. Cómo se construye un objeto es un detalle de implementación.