Лучше ли сохранять дополнительную ссылку на подкласс или приводить к подклассу для вызова методов, специфичных для этого подкласса? - PullRequest
0 голосов
/ 27 октября 2019

У меня есть система, в которой объект может принимать универсальный объект конфигурации (например, шаблон flyweight). У меня также есть подкласс, который принимает объект подкласса конфигурации.

Чтобы получить доступ к свойствам, которые являются специфическими для объекта конфигурации подкласса, лучше поддерживать вторую ссылку на подкласс или приведение к подклассу?

например

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

Оба имеют одинаковый вывод

1 Ответ

2 голосов
/ 27 октября 2019

Я бы не хотел делать ни то, ни другое, и вы можете обойти и то и другое, заставив Base взять общее, например:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...