J'ai les classes suivantesDesign Classe - Classe de base avec générique
class GridBase
{
public object DataSource { get; set; }
}
class GenericGrid<T> : GridBase
{
public new T DataSource { get; set; }
}
les deux classes de grille GridBase et générique peut être instancié et l'on peut descendre soit aussi bien. Est-ce considéré comme le moyen correct/accepté de mettre en œuvre une telle hiérarchie? Ou devriez-vous aller le mile supplémentaire et mettre en œuvre comme le
class GridBase
{
protected object dataSource;
public object DataSource { get { return dataSource; } set { dataSource = value; } }
}
class GenericGrid<T> : GridBase
{
public new T DataSource { get { return (T)dataSource; } set { dataSource = value; } }
}
suivant est de même pour les classes non génériques lorsqu'une propriété est réintroduite dans un descendant, je suis juste en utilisant un exemple générique ici.
Une autre affaire et la question
abstract class SomeBase
{
protected abstract void DoSomething();
}
class Child : SomeBase
{
protected override void DoSomething()
{
/* Some implementation here */
}
}
La situation ici est que le cadre « X » déclare UneBase vous permettant de définir vos propres descendants. Les classes qu'ils créent (au moment de l'exécution) puis descendent de votre classe (Child dans le cas présent). Cependant, ils n'appellent pas votre méthode DoSomething(), à partir de leur implémentation de DoSomething().
Pour leur part, ils ne peuvent pas appeler aveuglément base.Dosomething() soit parce que le cas typique est que la classe qu'ils génèrent normalement descend de SomeBase et puisque la méthode est abstraite qui n'est pas valide. (Personnellement, je n'aime pas ce comportement en C#).
Mais de toute façon, ce design est-il bon ou accepté, cela n'appelle pas base.xxx(), surtout quand l '"intention" semble contredire?
EDIT Du point de vue de la conception du cadre. Est-ce acceptable/acceptable que cela fasse ça? Sinon, comment serait-il conçu de manière à empêcher un tel cas ou mieux de communiquer leur intention (dans les deux cas).
Votre deuxième question devrait être une question distincte. – jason