我知道施法本身并不是不好的做法,但在这种情况下是不是很糟糕?
我有以下类层次结构,最后是演员。
public class A<T>
{
public A(string name, T value)
{
Name = name;
Value = value;
}
public string Name { get; }
public T Value { get; }
}
public class B : A<double>
{
public B(string name, double value, string expression)
: base(name, value)
{
Expression = expression;
}
public string Expression { get; }
}
public class C
{
public C(A<double> a)
{
_a = a;
}
public string Name { get { return _a.Name; } }
public double Value { get { return _a.Value; } }
protected A<double> _a;
}
public class D : C
{
public D(B b) : base(b)
{
}
public string Expression { get { return ((B)_a).Expression; } }
}
有问题的一行: public string Expression {get {return((B)_a).Expression; }
答案 0 :(得分:3)
是的,这是不好的做法;喜欢所有向下转换(有时需要确定;但这并不能让它变好)。
以下代码将生成运行时异常:
A<double> myA = new A<double>("Test", 1.0d);
D test = new D(myA);
var boom = test.Expression; //InvalidCastException
而使用不同的结构甚至无法编译。例如,修改D
以取B
而不是A<double>
答案 1 :(得分:1)
试试这个,让C类通用
public class C<T> where T : A<double>
{
public C(T thing)
{
_thing = thing;
}
protected T _thing;
}
然后D可以是C的实例,其泛型参数为B
public D : C<B>
{
Public string Expression { get {return _thing.Expression;}}
}
我在手机上,所以请原谅。格式化或拼写错误