Czy ktoś może mi pomóc z linią where TEntity : class, IEntity, new()
w poniższej deklaracji klasy."gdzie" słowo kluczowe w deklaracji klas wc c
public abstract class BaseEntityManager<TEntity>
where TEntity : class, IEntity, new()
Czy ktoś może mi pomóc z linią where TEntity : class, IEntity, new()
w poniższej deklaracji klasy."gdzie" słowo kluczowe w deklaracji klas wc c
public abstract class BaseEntityManager<TEntity>
where TEntity : class, IEntity, new()
where TEntity : ...
stosuje ograniczenia do parametru ogólnego TEntity. W tym przypadku ograniczenia są:
klasa: Argument TEntity musi być typem odniesienia
IEntity: Argument musi być albo implementować interfejs IEntity
new(): Argument musi mieć konstruktora bez parametrów publicznego
Jeśli mógłbyś dodać kod pokazujący, jak ktoś mógłby użyć BaseEntityManager jako klasy bazowej, która byłaby niesamowita :) – niico
Gdzie jest rodzajowy typu ograniczenia. Linie te odczytują, że typ TEntity musi być typem odniesienia, a nie typem wartości, musi implementować interfejs IEntity i musi mieć konstruktor, który nie przyjmuje parametrów.
where
kluczowe po deklaracji klasy, co ogranicza typ rodzajowy TEntity
może być. W tym przypadku TEntity
musi być klasą (co oznacza, że nie może być typem wartość jak int
lub DateTime
), i musi implementować interfejs IEntity
. Ograniczenie new()
wskazuje, że metody wewnątrz tej klasy mają możliwość wywoływania domyślnego konstruktora klasy ogólnej reprezentowanej przez TEntity
(np. new TEntity()
)
Na czym polega pytanie?
Pozwólcie, że rzucę okiem na to, co myślę, że to pytanie. Ograniczenie zapewnia, że można tylko podklasę BaseEntityManager z ogólnym parametrem, który jest typem odniesienia implementującym IEntity i zawierającym konstruktor bez parametrów.
E.X.
public class Product : IEntity {
public Product() {}
}
public class Wrong {
public Wrong() {}
}
public class WrongAgain : IEntity {
private Wrong() {}
}
// compiles
public ProductManager : BaseEntityManager<Product> {}
// Error - not implementing IEntity
public WrongManager : BaseEntityManager<Wrong> {}
/Error - no public parameterless constructor
public WrongAgainManager : BaseEntityManager<WrongAgain> {}
zobaczyć link text
"Czy ktoś mógłby mi pomóc z linią ...?" Oto jest pytanie. To oczywiste, o co pyta. –
A twoje pytanie? –
Myślę, że prosi o wyjaśnienie składni. – Matt