tutorial significa que property new mvc multiples interfaces implementar implement c# .net interface new-operator

significa - override interface property c#



¿Qué significa "nueva" palabra clave cuando se utiliza dentro de una interfaz en C#? (7)

C # y .NET no le permiten declarar un constructor en una interfaz.

Simplemente tiene que ser una restricción establecida para implementar esa interfaz (consulte ISerializable en las bibliotecas .NET).

Si lo piensas bien, tener un constructor en una interfaz no tiene sentido, ya que debes saber la clase concreta que quieres crear cuando llames al constructor. ¿Cómo iría a llamar a un constructor de interfaz de este tipo, y cuál sería el resultado?

Desarrollo de una interfaz genérica Deseaba declarar un constructor en una interfaz pero dice que los constructores están prohibidos allí. He intentado declarar un método de fábrica estático en ese momento, pero dice que no se permiten métodos estáticos y sugiere el uso de palabras clave "nuevas". Pero casi no tengo idea de lo que podría significar exactamente "nueva" palabra clave cuando se utiliza dentro de una interfaz en C #. ¿Tienes?

ACTUALIZAR:

No publiqué ningún código de muestra porque no quería mezclar 2 preguntas: cómo especificar un constructor / fábrica en una interfaz Y qué significa la palabra clave ''nueva'' en las interfaces. Incluso me obligaron a especificar la primera parte porque StackOverflow no aceptó la segunda pregunta en forma pura, diciendo que no cumple con los estándares de calidad.

Pero, como usted exige, voy a probar lo que estaba tratando de lograr:

Interface IMyInterface <T, U, V> { IMyInterface (T, U, U); // OR static IMyInterface GetNewIMyInterface (T, U, U); }

Solo quiero que cada clase derivada implemente tal constructor.


Estás utilizando una interfaz, pero parece que quieres una clase base en su lugar. Una interfaz nunca debe necesitar un constructor, ya que no puede contener ningún campo que deba inicializarse en el constructor. Creo que quieres usar una clase base en su lugar.


La new palabra clave le dice al compilador que su definición oculta la definición contenida en las interfaces que su interfaz podría estar extendiendo.


La respuesta de Bala es correcta, pero podría ser útil ver por qué querrías hacer esto. Considere el problema que enfrentaron los diseñadores de BCL cuando diseñaron las bibliotecas para la versión 2 de CLR. Había una interfaz existente:

interface IEnumerable { IEnumerator GetEnumerator(); }

Ahora quieres agregar:

interface IEnumerable<T> : IEnumerable { new IEnumerator<T> GetEnumerator(); }

La nueva interfaz difiere de la antigua únicamente en el tipo de retorno.

¿Cuáles son tus elecciones?

1) Marque el nuevo GetEnumerator como "nuevo" para que el compilador sepa que se pretende que sea el nuevo método que no entre en conflicto con el método antiguo del mismo nombre pero con un tipo de retorno diferente.

2) Cambie el nombre a GetEnumerator2.

3) No heredar del IEnumerable original.

Las opciones 2 y 3 son horribles. La opción 1 es increíble: los nuevos enumerables funcionan a la perfección con el código que espera los enumerables antiguos, pero el código escrito para utilizar los nuevos enumerables obtiene el comportamiento genérico "nuevo" de forma predeterminada.


No puede especificar un constructor o un método estático en una interfaz ... lo que puede hacer es agregar una restricción de tipo para un parámetro de tipo genérico, por ejemplo

void Foo<T>() where T : new() { T t = new T(); // Do stuff with t }

¿Es eso lo que estás pensando?


Primero, lo único que realmente hace la palabra clave "nueva" es pedirle al compilador que NO produzca una advertencia de que debe usar la palabra clave "nueva". Aparte de deshacerse de la advertencia, la palabra clave en sí no hace nada (en el contexto en cuestión).

Ahora, el compilador TE QUIERE que uses la palabra clave ''nueva'' cuando redefinas un miembro (propiedad o método) ya definido en una interfaz de la que heredas, y hay al menos dos razones posibles para hacer esto. Primero, como Eric Lippert mencionó anteriormente, es posible que desee un método para devolver un tipo diferente (o definir una propiedad del mismo nombre con un tipo diferente). Otra posibilidad es si desea definir diferentes implementaciones para las dos interfaces:

interface A { void a(); } interface B : A { new void a(); } class C : B { void A.a() { Console.WriteLine("Called by interface A!"); } void B.a() { Console.WriteLine("Called by interface B!"); } } static class Test { public static void DoTest() { B b = new C(); b.a(); // Produces "Called by interface B!" ((A)b).a(); // Produces "Called by interface A!" } }

Si intenta definir Ba() en C sin redefinir a() en B, recibirá una advertencia de que no es miembro de la interfaz: la declaración de interfaz explícita requiere que use una interfaz para la cual el miembro está explícitamente definido.