In C# 1.x se volevo fare una classe di soli membri statici mi accontentavo di fare così:
namespace BudgetForecast.DataLayer
{
public sealed class AlberoTarget
{
private AlberoTarget() {}
public static System.Data.DataTable GetNodiRadice() { return null; }
}
}
Ma con queste controindicazioni:
- per errore avrei potuto aggiungere un metodo di istanza
- per errore avrei potuto aggiungere del codice al costruttore privato
- per "malizia" avrei potuto aggiungere la classe nidificata Alberotarget.NodoAlbero la quale riuscirebbe ad istanziare AlberoTarget
Aggiungendo un abstract però riuscirei a risolvere i punti 1) e 3) e il compilatore potrebbe avvisarmi del problema del punto 2):
namespace BudgetForecast.DataLayer
{
public abstract sealed class AlberoTarget
{
public static System.Data.DataTable GetNodiRadice() { return null; }
}
}
Ma dalle specifiche del C# 1.x: una classe abstract non può essere sealed. Non avevano pernsato che la cosa poteva avere un senso ed essere utile?
Nel C#2.0 hanno rimosso questa limitazione? No, hanno preferito aggiungere una nuova keywork static che crea appunto una classe abstract sealed.
Ciò che ha distinto il C# 1.x dal C++ è la scelta di un punto ottimale di equilibrio/compromesso tra la potenza e la complessità del linguaggio per ridurre la probabilità di bug, ridurre i costi di formazione e aumentare la produttività.
Ciò che distingue il C++ dal C# è il fatto che le funzionalità del C++ possono essere combinate tra loro per "creare" nuove funzionalità (es. la derivazione privata, i metodi virtuali privati, ...).
Insomma... questa scelta di creare una nuova keyword invece che usare le esistenti mi sembra che aumenti la complessità senza dare maggiore potenza e mi sembra un atto di sfiducia nella capacità degli sviluppatori C# di combinare in modo creativo le funzionalità del linguaggio.
Se non si è capito... la cosa non incontra i miei gusti ;-)