¿Hay algún mecanismo para permitir que una clase sea heredada por N clases solo en C#?¿Cómo puedo crear una clase A en C#, donde A solo puede ser heredada por B, C, D?
Respuesta
Puede ponerlo y sus clases derivadas en un ensamblaje separado, y declarar el constructor de la clase base como internal
. De esa manera, aunque podría heredar de ella en un ensamblaje diferente, no podría instanciar ninguna clase derivada.
¿Cómo se puede heredar pero no se puede crear una instancia? – Mehrdad
@Mehrdad: como la clase derivada llama al constructor de la base, debe tener acceso a ese constructor. Poner el acceso a 'interno' solo permite que las clases derivadas en el mismo ensamblaje (o ensamblajes de amigos) llamen a la base. También se debe tener en cuenta que las clases derivadas deben ser "selladas". –
@Travis: ¿Pero cómo se puede hacer cumplir que las clases derivadas no se crean instancias? – Mehrdad
Puede hacer que la clase A abstarct y heredar en cualquier número de clases ..
Creo que en este caso que N = 3 –
@Tom: por favor, vea la respuesta dada por Abatishchev, solo quería decir lo mismo ... Pensé que después de la sugerencia, descanse el interlocutor puede google ... – Stuti
No, pero siempre se puede hacer que el constructor de una excepción si se supera el límite.
¿cómo puedo saber ¿Cuántas clases hereda de A? –
Registre los tipos de 'this' en una tabla hash en el constructor de la clase base. – Koterpillar
// can be inherited only by classes in the same assembly
public abstract class A
{
protected internal A() { }
}
// can't be inherited
public sealed class B : A
{
}
Sólo para mi edificación personal, me gustaría saber más acerca del contexto de negocios que hacen esta elección de diseño deseable, ya que mi primera thougt al leer el título fue "Oh, muy, muy mala idea! Una la clase base NUNCA se supone que sepa nada (y lo que es peor: que gobierne) sus clases derivadas ".
- 1. ¿Por qué una estructura C# no puede ser heredada?
- 2. Objetivo-C: acceder a propiedades privadas en una clase heredada
- 3. Cómo convertir A [B [C]] a B [A [C]] si A y B son mónadas?
- 4. Rangos A a B donde A> B en F #
- 5. ¿Cuándo puede a == b ser falso y a.Equals (b) verdadero?
- 6. La manera más fácil de convertir "a/b/c" a ["a/b/c", "a/b", "a"]
- 7. C: ¿Convert A? B: C en si (A) B cosa C
- 8. cuenta de rutas acíclicas distintas de A [a, b] a A [c, d]?
- 9. evento Pass de la clase C a través de la clase B a la clase A
- 10. ¿Cómo anular una propiedad de clase heredada en C#?
- 11. Lógica: is (A &&! (B || C)) || (B || C) lo mismo que (A || B || C)?
- 12. ¿Cómo puedo implementar una clase de C++ en Python para ser llamado por C++?
- 13. Ruby - primordial/permitiendo la asignación múltiple (por ejemplo, `a, b, c = d, e, F`)
- 14. ¿Cuál es la diferencia entre '(a b c) y (lista' a 'b' c)?
- 15. cómo recortar "a b c" en "abc"
- 16. ¿Cómo obtengo (a, b) => c de a => b => c en Scala?
- 17. ¿Por qué C++ no permite la amistad heredada?
- 18. ¿Qué significa la operación c = a +++ b?
- 19. Functor es para (a -> b) -> (f a -> f b), ¿qué es para (Categoría c) => c a b -> c (f a) (f b)?
- 20. Hacer una clase no heredada
- 21. ¿Es esto posible de alguna manera en C#: if (a == b == c == d) {...}
- 22. Javascript a = b = declaraciones C
- 23. Cómo convertir 'Clase A' a su subclase 'Clase B' - Objetivo-C
- 24. C#. Hacer si (a == (b o c o d)). ¿Es posible?
- 25. Cómo crear un constructor que solo sea utilizable por una clase específica. (C++ Amigo equivalente en C#)
- 26. ¿Es posible crear una cola usando {a, b, c} en C#?
- 27. Marshal una clase C++ a C#
- 28. ¿Cuál es la diferencia entre "clase C parte A con B" y "Clase C parte B" cuando rasgo B se extiende rasgo Un
- 29. Cuente con A, B, C, D en lugar de 0, 1, 2, 3, ... con JavaScript
- 30. cómo evitar que la clase 'a' sea heredada por otra clase?
¿Están 'B',' C' y 'D' en el mismo conjunto? –
¿Necesita esto estar en tiempo de ejecución o de compilación? – rerun
¿Hay alguna razón específica para que lo haga? Tal vez un ejemplo real ayude. – Koterpillar