Когда дочерние классы наследуются от родительского класса, есть ли способ использовать разные типы данных для унаследованного поля, чтобы добавить больше функциональности? - PullRequest
1 голос
/ 21 апреля 2020

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

Мне нужно создать два объекта, которые имеют некоторые сходства, но достаточно разные, чтобы гарантировать наличие разных классов. Поэтому я думаю, что для них подойдет базовый класс. У меня есть два подпорки, созданные в базовом классе 'ParentBase', которые содержат общие вещи для использования дочерними классами, и дочерние классы должны добавить дополнительную функциональность к этим разделяемым реквизитам.

Например, поле "Настройки" из ParentBase должны быть расширены в классах Parent1 и Parent2 для их собственных уникальных потребностей. Мне кажется, что мне нужно создать новые типы данных для расширения поля «Настройки» для классов Parent1 и Parent2.

class ParentBase
{
    public ChildA Settings { get; set; }
    public ChildX MoreSettings { get; set; }
    // lots of shared props here that won't be extended in inheriting classes

    public void SomeFunction()
    {
        // The inheriting class's Settings and MoreSettings props should be available to access here
        // even though their data types are different to the base class's Settings and MoreSettings
        // data types
    }
}
class Parent1 : ParentBase
{
    public ChildB Settings { get; set; }
    public ChildY MoreSettings { get; set; }
}
class Parent2 : ParentBase
{
    public ChildC Settings { get; set; }
    public ChildZ MoreSettings { get; set; }
}

class ChildA { // base props and methods in here }
class ChildB : ChildA { // Parent1 specific functionality }
class ChildC : ChildA { // Parent2 specific functionality }

class ChildX { // base props and methods in here }
class ChildY : ChildX { // Parent1 specific functionality }
class ChildZ : ChildX { // Parent2 specific functionality }

Мне также нужно создать функции вне базового класса, которые будут принимать объекты Parent1 или Parent2. в качестве параметров. Например:

public void Calculate(SomeSharedType Parent1/Parent2 instance)
{
  // need to access the Settings and MoreSettings properties here, and the base class's Setting should suffice,
  // although it would be nice to access the inheriting class's Settings and MoreSettings properties
}

Есть ли способ для меня достичь этого с помощью наследования или интерфейсов?

1 Ответ

2 голосов
/ 21 апреля 2020

Отвечает ли это на ваш вопрос?

class ParentBase<T,U>
    {
        public virtual T Settings { get; set; }
        public virtual U MoreSettings { get; set; }

    }
    class Parent1 : ParentBase<ChildB, ChildY>
    {
        public override ChildB Settings { get; set; }
        public override ChildY MoreSettings { get; set; }
    }
    class Parent2 : ParentBase<ChildC, ChildZ>
    {
        public override ChildC Settings { get; set; }
        public override ChildZ MoreSettings { get; set; }
    }

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

class ParentBase<T,U>
        {
            public T Settings { get; set; }
            public U MoreSettings { get; set; }

        }
        class Parent1 : ParentBase<ChildB, ChildY>
        {

        }
        class Parent2 : ParentBase<ChildC, ChildZ>
        {

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...