簡體   English   中英

從基層開始

[英]Casting Down from Base class

我知道轉換並不是天生的壞習慣,但是在這種情況下是不好的嗎?

我具有以下類層次結構,並且在最后強制轉換。

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

是的,這是不好的做法; 所有的垂頭喪氣(有時需要確定;但這並不能很好)。

以下代碼將生成運行時異常:

A<double> myA = new A<double>("Test", 1.0d);
D test = new D(myA);
var boom = test.Expression; //InvalidCastException

而采用其他結構甚至無法編譯。 例如,將D修改為B而不是A<double>

試試這個,使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;}}
}

我在手機上,請原諒.sny格式或拼寫錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM