Возвращаемый тип варианта интерфейса

#c# #interface

#c# #интерфейс

Вопрос:

Например, у меня есть два класса. У каждого из них есть Deconstruct() метод. Как я могу представить это в интерфейсе?

 public class A
{
    public Foo Foo { get; }
    public Bar Bar { get; }
    public Baz Baz { get; }

    public (Foo, Bar, Baz) Deconstruct()
    {
        return (Foo, Bar, Baz); 
    }
}

public class B 
{
    public Foo Foo { get; }
    public Bar Bar { get; }

    public (Foo, Bar) Deconstruct()
    {
        return (Foo, Bar);
    }
}

public interface IDeconstructable
{
    (variable return type) Deconstruct(); 
}
 

Комментарии:

1. Короткий ответ — вы не можете, поскольку возвращаемый тип отличается.

2. Вот ошибка : две разные сигнатуры методов подразумевают два разных метода… Но, возможно, вы можете использовать обобщения. Вам нужны обобщения?

3. С точки зрения приведенных ниже общих ответов, я бы сказал, только потому, что вы можете , это не значит, что вы должны . Вероятно, это должны быть разные методы, которые выполняют разные действия и имеют разные имена

Ответ №1:

Я могу придумать 2 способа сделать это, но ни один из них не подойдет для использования с разными типами возвращаемых данных.

 public interface IDeconstructable<T>
{
    T Deconstruct(); 
}
 

Затем вызовите его как public class B : IDeconstructable<(Foo, Bar)>

в качестве альтернативы вы могли бы

 public interface IDeconstructable
{
    dynamic Deconstruct(); 
}
 

или

  public interface IDeconstructable
 {
     object Deconstruct(); 
 }
 

и используйте сопоставление с образцом для определения типа возвращаемого значения