У меня есть класс, который должен использовать объект, и объект является ограничением какого-то класса. Однако у меня есть два дизайна для реализации этого метода: общий и полиморфизм, а затем пример кода, как показано ниже:
class S3 : S{}
class S2 : S{}
class S{}
class C : A{
public override void DoOne(S s){
var tmp = s as S3;
}
public override void DoTwo<T>(T s){
var tmp = s as S3;
}
}
class B : A{
public override void DoOne(S s){
var tmp = s as S2;
}
public override void DoTwo<T>(T s){
var tmp = s as S2;
}
}
abstract class A{
public abstract void DoOne(S s);
public abstract void DoTwo<T>(T s) where T : S;
}
var s2 = new S2();
var b = new B();
b.DoOne(s2);
b.DoTwo(s2);
Классу B
нужно использовать S2
объект, и, возможно, у меня есть класс C
, который нужно использовать S3
объект.
Я не знаю, что лучше для их реализации.
На самом деле, я хочу сравнить производительность или другое соображение для них.
Ни один из двух способов не является типобезопасным. Ни один из них не мешает вам передать S3
в B
или S2
в C
. Использование дженериков довольно избыточно, когда вы используете T
только один раз в качестве типа параметра.
Более типобезопасным подходом было бы использование универсального интерфейса/абстрактного класса A
:
abstract class A<T> where T : S {
public abstract void DoOne(T s);
}
class C : A<S3> {
public override void DoOne(S3 s){
// ...
}
}
class B : A<S2> {
public override void DoOne(S2 s){
// ...
}
}
Таким образом, C
и B
не имеют общего базового класса. Вот как это должно быть, если вы хотите безопасности типов.
Если вам не нужна безопасность типов (не рекомендуется), вместо этого примите S
. Дженерики здесь мало что значат.
Есть и другие способы, зачем останавливаться на достигнутом? Короче говоря, оба ваших варианта подозрительны, кроме того, вы всегда должны предпочитать композицию наследованию. Однако в вопросе отсутствуют достаточные ограничения или варианты использования, чтобы сделать любой ответ полезным. То есть этот код хорош в любом случае (он работает), но вы можете столкнуться с рядом проблем и ограничений, когда попытаетесь использовать любое такое решение в определенной ситуации.