Я смог избежать этого (по крайней мере с интерфейсами), наследуя от отдельного класса, содержащего вложенные интерфейсы. (В моем случае я также возвращение ссылки на эти интерфейсы.)
Вместо:
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
ли что-то вроде этого:
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() {
...
}
}
Чтобы избежать безобразия с явными реализаций интерфейса, вы может также наследоваться от другого класса, хотя это не сработает, если вы пытаетесь наследовать от вложенного класса, поскольку вы не можете наследовать оба класса.
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() {
...
}
}
Интересно, есть ли какая-то особая причина, по которой вы хотели бы это сделать, или вы опубликовали ее для обсуждения и обучения? Каким было бы практическое применение, если это было возможно? – Daan 2008-11-05 16:11:43
@ Daan при внедрении свободного шаблона шаблона generic builder, у меня есть интерфейсы в общем классе, который я хочу реализовать в этом же классе. из-за этой проблемы я должен переместить интерфейсы в отдельный класс (должен быть в классе, чтобы они могли делиться общими типами и ограничениями). это сделало явную реализацию интерфейса крайне уродливой, так как я должен ссылаться на этот другой класс. (На самом деле я избегал ошибки и уродства, наследуя от этого другого класса ...) – 2016-08-29 02:10:15