Как сделать так, чтобы класс передавал свой собственный тип в обобщениях имени параметра? - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть два abstract класса: Particle и ParticleHub<T> where T : Particle.

Я хочу, чтобы, когда я наследую Particle, его конструктор требовал ParticleHub его соответствующего типа для быть передан в качестве параметра. Я хочу, чтобы его конструктор был таким:

ParticleHub</*type of the inheriting class*/> _particleHub;

public Particle(ParticleHub</*type of the inheriting class*/> particleHub, OtherParameters otherParameters)
{
    _particleHub = particleHub;
    //use other parameters
}

Если я напишу ParticleHub<typeof(this)>, я перегружен ошибками, которые заставляют меня думать, что я нарушил синтаксис для остальной части файла. Если я делаю ParticleHub<this.GetType()>, я получаю ту же проблему, но только с меньшим количеством ошибок. Хотя с этим я могу понять, что не могу использовать функцию в параметре такого типа.

Так как мне go об этом?

Ответы [ 3 ]

0 голосов
/ 12 апреля 2020

Простой пример ниже интерфейса и обобщенного c шаблона

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");


        IChair chair = new Chesterfield<Arm>(new Arm());
        chair.Sit();
        Console.Write(chair.HasSat());
    }
}

public interface IChair
{
    void Sit();
    bool HasSat();
}

public interface IPart
{

}

public class Chesterfield<TPart> : Chair<TPart> where TPart : IPart
{
    public Chesterfield(TPart part) => _part = part;
    private bool _hasSat;
    private readonly TPart _part;

    public override void Sit()
    {
        _hasSat = true;
    }

    public override bool HasSat() => _hasSat;
}

public abstract class Chair<TPart> : IChair where TPart : IPart
{
    public abstract void Sit();
    public abstract bool HasSat();
}

public class Arm : IPart
{

}

public class Back : IPart
{

}

public class Leg
{

}
0 голосов
/ 19 апреля 2020

Передача самого унаследованного класса, как показано ниже.

        public abstract class Particle
        {
        }

        public abstract class ParticleHub<T> where T : Particle
        { 
        }

        public class k1 : Particle
        {
            ParticleHub<k1> _particleHub = null;
            public k1(ParticleHub<k1> ph)
            {
                _particleHub = ph;
            }
        }
0 голосов
/ 12 апреля 2020

Думаю, у вас нет другого выбора, кроме как передать тип как другой тип c. Посмотрите пример, как это делается с точки зрения беглых строителей, поскольку я думаю, что это очень близко к тому, что вы хотите иметь: Ссылка .

Как:

FePatricle<T, U> where T: Particle, U: FeParticle<T, U>

Выглядит сумасшедшим, но это должно сработать в конструкторе:

public FeParticle(ParticleHub<U>...

РЕДАКТИРОВАТЬ:

Или, насколько я понимаю, более вероятно:

FePatricle<T>: Particle where T: FeParticle<T>

Итак FePartivle расширяет Particle и несет с собой свой собственный тип T?

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