从基类转发

时间:2018-06-14 22:18:23

标签: c#

我知道施法本身并不是不好的做法,但在这种情况下是不是很糟糕?

我有以下类层次结构,最后是演员。

    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; }

2 个答案:

答案 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;}}
}

我在手机上,所以请原谅。格式化或拼写错误