首页 > 解决方案 > 保留对子类的额外引用或强制转换为子类以调用特定于该子类的方法是更好的做法吗?

问题描述

我有一个对象可以采用通用配置对象的系统(想想享元模式)。我还有一个子类,它采用子类配置对象。

为了访问特定于子类配置对象的属性,是维护对子类的第二个引用还是强制转换为子类更好?

例如

class Base {
    public BaseConf Conf;
    public Base(BaseConf C) {
        Conf = C;
    }
}

class Derived : Base {
    public DerivedConf DerConf;  //Create an extra reference, no casting
    public Derived(DerivedConf DC) : base(DC) {
        DerConf = DC;
    }

    public void PrintName() {
        Console.WriteLine(DerConf.Name);
    }
}

class BaseConf {
    public BaseConf() {}
}

class DerivedConf : BaseConf {
    public string Name;
    public DerivedConf(string n) : base() {
        Name = n;
    }
}

对比

class Base {
    public BaseConf Conf;
    public Base(BaseConf C) {
        Conf = C;
    }
}

class Derived : Base {
    public Derived(DerivedConf DC) : base(DC) {}

    public void PrintName() {
        DerivedConf DerConf = Conf as DerivedConf; //Cast, no extra reference
        Console.WriteLine(DerConf.Name);
    }
}

class BaseConf {
    public BaseConf() {}
}

class DerivedConf : BaseConf {
    public string Name;
    public DerivedConf(string n) : base() {
        Name = n;
    }
}

两者都有相同的输出

标签: c#inheritance

解决方案


我不想做其中任何一个,你可以通过将Basetake 设为通用来解决这两个问题,如下所示:

class Base<T> where T : BaseConf
{
    public T Conf;
    public Base(T C)
    {
        Conf = C;
    }
}

class Derived : Base<DerivedConf>
{
    public Derived(DerivedConf DC) : base(DC)
    { 
    }

    public void PrintName()
    {
        Console.WriteLine(Conf.Name);
    }
}

static void Main(string[] args)
{
    var derived = new Derived(new DerivedConf("Foo"));
    derived.PrintName(); // Foo
}

推荐阅读