Как я могу специализировать типы аргументов для наследников класса? - PullRequest
3 голосов
/ 19 января 2012

Я хочу иметь абстрактный класс Server с абстрактным методом с именем Initialize, который передает ссылку на IConnection по ссылке.Исходя из этого, унаследованный от этого класс должен по существу специализироваться на объекте IConnection с его реализацией Initialize.Это нормально, за исключением того, что я хочу также иметь два абстрактных метода: DataSent и DataReceived, и я хочу использовать специализированный тип в их сигнатуре, возможно, через обобщенные значения.

Нечто подобное мне нужно:

public override void Initialize(ref IConnection connection)
{
    connection = new MySpecialConnection(connection);
}

public override void DataSent(MySpecialConnection connection, byte[] data)
{

}

public override void DataReceived(MySpecialConnection connection, byte[] data)
{

}

Есть ли простой способ сделать это?Большую часть дней я играл с дженериками, и никто из тех, с кем я общался в Интернете, не смог найти решение.

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

1 Ответ

1 голос
/ 19 января 2012

Почему не только это?

abstract class Server<T> where T : IConnection
{
    public abstract void Initialize(ref IConnection conn);
    public abstract void DataSent(T conn, byte[] data);
    public abstract void DataReceived(T conn, byte[] data);
}

class SpecialServer : Server<SpecialConnection>
{
    public override void Initialize(ref IConnection conn)
    {
        conn = new SpecialConnection(conn);
    }

    public override void DataSent(SpecialConnection conn, byte[] data)
    {
        //things
    }

    public override void DataReceived(SpecialConnection conn, byte[] data)
    {
        //stuff
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...