Введите параметры или ограничения в перегруженном конструкторе generi c - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть обобщенный класс c, для которого я хочу несколько конструкторов. В одном из этих конструкторов я хочу передать параметр типа перегруженному конструктору. Это возможно?

Скажем, у меня есть это.

public class Collection<T>
{
    public Collection(IEnumerable<T> collection, Func<T, T, int> distanceCalculation)
    {

    }
}

Это сработает. Теперь я могу создать экземпляр моего класса с чем-то вроде

var collection = new Collection<int>(new List<int>(), (a, b) => a - b);

Но теперь я хочу упростить использование класса Collection, поэтому я создал интерфейс, такой как IComparable, для определения logi для вычисления расстояния c в сам класс:

public interface IDistanceCalculable
{
    int CalculateDistance(object other);
}

Я думал, что тогда смогу создать еще один конструктор для Collection, но он не компилируется:

public Collection(IEnumerable<IDistanceCalculable> collection) : this<IDistanceCalculable>(collection, (a, b) => a.CalculateDistance(b))
{

}

Или

public Collection(IEnumerable<T> collection) where T : IDistanceCalculable : this(collection, (a, b) => a.CalculateDistance(b))
{

}

Потому что я не могу дать аргумент типа базовому конструктору, который вызывается, или указать дополнительные ограничения для конструктора. Есть ли способ сделать что-то подобное?

Я обнаружил, что могу использовать метод stati c для достижения того же, но это выглядит как менее чистый код, чем новый конструктор

public static Collection<V> From<V>(IEnumerable<V> collection) where V : IDistanceCalculable
{
    return new Collection<V>(collection, (a, b) => a.CalculateDistance(b));
}
...