Pude evitar esto (al menos con interfaces) al heredar de una clase separada que contiene las interfaces anidadas. (En mi escenario también estoy volviendo referencias a estas interfaces.)
En lugar de:
public class MyClass<T1, T2, T3> :
MyClass<T1, T2, T3>.Interface
where T1 : ...
where T2 : ...
where T3 : ... {
public interface Interface { Interface SomeMethod(); }
Interface Interface.SomeMethod() {
...
}
}
// compile error: Circular base class dependency
hacer algo como esto:
public sealed class MyClassInterfaces<T1, T2, T3>
where T1 : ...
where T2 : ...
where T3 : ... {
public interface Interface { Interface SomeMethod(); }
}
sealed class MyClass<T1, T2, T3> :
MyClassInterfaces<T1, T2, T3>.Interface
where T1 : ...
where T2 : ...
where T3 : ... {
MyClassInterfaces<T1, T2, T3>.Interface
MyClassInterfaces<T1, T2, T3>.Interface.SomeMethod() {
...
}
}
Para evitar la fealdad con implementaciones de interfaces explícitas, se también puede heredar de la otra clase, aunque eso no funcionaría si estuviera tratando de heredar de una clase anidada, ya que no puede heredar de ambas clases.
public abstract class MyClassInterfaces<T1, T2, T3>
where T1 : ...
where T2 : ...
where T3 : ... {
public interface Interface { Interface SomeMethod(); }
}
sealed class MyClass<T1, T2, T3> :
MyClassInterfaces<T1, T2, T3>,
MyClassInterfaces<T1, T2, T3>.Interface
where T1 : ...
where T2 : ...
where T3 : ... {
Interface Interface.SomeMethod() {
...
}
}
Me pregunto, ¿hay alguna razón en particular por la que le gustaría hacer esto, o la publicó para el debate y el aprendizaje? ¿Cuál sería la aplicación práctica si fuera posible? – Daan
@Daan durante la implementación de una interfaz fluida de patrón genérico de compilador, tengo interfaces en una clase genérica que deseo implementar en esa misma clase. debido a este problema, tengo que mover las interfaces a una clase separada (tiene que estar en una clase para que puedan compartir los tipos genéricos y las restricciones). esto ha hecho que la implementación explícita de la interfaz sea extremadamente fea, ya que tengo que referirme a esa otra clase. (En realidad evité el error y la fealdad al heredar de esa otra clase ...) –