C# - переопределить обобщенные c ограничения типа обобщенных c абстрактных методов - PullRequest
0 голосов
/ 09 апреля 2020

Можно ли переопределить общие ограничения для реализации абстрактных методов?

Позвольте мне объяснить ... обычно я хотел бы сделать что-то вроде:

public abstract class A
{
    public abstract class IData {}

    public abstract void DoSomething(IData data);
}

public class B : A
{
    public DataB : IData
    {
        public int ciao;
    }

    public override void DoSomething(IData data)
    {
        DataB d = data as DataB;

        if (d == null)
        {
             // print error or whatever...
             return;
        }

        int miao = d.ciao * 2;
        // do whatever with miao or d.ciao...
    }
}

public class C : A
{
    public DataC : IData
    {
        public float arrivederci;
    }

    public override void DoSomething(IData data)
    {
        DataC d = data as DataC;

        if (d == null)
        {
             // print error or whatever...
             return;
        }

        int bau = d.arrivederci * 2f;
        // do whatever with bau or d.arrivederci...
    }
}

Что мне не нравится, так это что я могу передать функции DoSomething недопустимый тип параметра.

Я хотел бы иметь возможность сделать что-то вроде

public class B : A
{
    public DataB : IData
    {
        public int ciao;
    }

    public override void DoSomething(DataB data)
    {
        int miao = d.ciao * 2;
        // do whatever with miao or d.ciao...
    }
}

public class C : A
{
    public DataC : IData
    {
        public float arrivederci;
    }

    public override void DoSomething(DataC data)
    {
        int bau = d.arrivederci * 2f;
        // do whatever with bau or d.arrivederci...
    }
}

, что, конечно, невозможно.

По этой причине я закончил тем, что сделал что-то вроде:

public abstract class A
{
    public abstract class IData {}

    public abstract void DoSomething<T>(T data) where T : IData;
}

Следующим шагом было бы сделать что-то вроде

public class B : A
{
    public DataB : IData
    {
        public int ciao;
    }

    public override void DoSomething<T>(T data) where T : DataB
    {
        int miao = d.ciao * 2;
        // do whatever with miao or d.ciao...
    }
}

public class C : A
{
    public DataC : IData
    {
        public float arrivederci;
    }

    public override void DoSomething<T>(T data) where T : DataC
    {
        int bau = d.arrivederci * 2f;
        // do whatever with bau or d.arrivederci...
    }
}

Так что, по сути, переопределите generi c ограничение, которое я установил в абстрактном методе родителя c. Есть ли способ достичь этого?

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

1 Ответ

0 голосов
/ 04 мая 2020

Очевидно, что я пытаюсь достичь в настоящее время не возможно в C#. После некоторого ожидания, чтобы увидеть, есть ли обходной путь, я решил процитировать комментарий JasperKent как окончательный ответ:

Язык просто не позволяет этого. См .: docs.microsoft.com / ru-ru / dotnet / csharp / misc / cs0460

...