Наследование несколькими интерфейсами, содержащими одни и те же члены с разными типами данных

У меня следующая ситуация:

using System.Data;

namespace TestClass
{
    //this is a class generated by a wsdl and may not be changed
    public partial class MyTableClass : DataTable
    {
        public MyRowClass this[int index]
        {
            get { return ((MyRowClass) (this.Rows[index])); }
        }

        public partial class MyRowClass : DataRow
        {
            protected internal MyRowClass(DataRowBuilder builder)
                : base(builder)
            {
            }
        }
    }

    //in this partial class I am able to extend the wsdl class by my own interfaces
    public partial class MyTableClass : IDetailTable
    {
        IDetailRow IDetailTable.this[int index]
        {
            get { return this[index]; }
        }

        public partial class MyRowClass : IDetailRow
        {
        }
    }

    public interface IBaseTable
    {
        IBaseRow this[int index] { get; }
    }

    public interface IDetailTable : IBaseTable
    {
        new IDetailRow this[int index] { get; }
    }

    public interface IBaseRow
    {
    }

    public interface IDetailRow : IBaseRow
    {
    }
     }

Первая часть - это класс, сгенерированный определением wsdl. Здесь у меня нет возможности что-либо изменить. У меня много файлов определений wsdl, большинство из них очень похожи. Поэтому я хочу определить общие интерфейсы для всех, что упростит мне обработку их в моем коде. Поэтому моя идея заключалась в том, чтобы расширить их с помощью определения частичного класса, как указано выше.

Но я получаю здесь ошибку, и я понятия не имею, почему и что мне здесь делать:

Ошибка 1 «TestClass.MyTableClass» не реализует член интерфейса «TestClass.IBaseTable.this [int]». «TestClass.MyTableClass.this [int]» не может реализовать «TestClass.IBaseTable.this [int]», потому что у него нет соответствующего типа возврата «TestClass.IBaseRow». c: \ users \ mag \ documents \ Visual Studio 2012 \ Projects \ TestClass \ TestClass \ Class1.cs 6 24 TestClass

Реализуются только базовые интерфейсы, а не производные интерфейсы деталей. Но почему?


person Max    schedule 24.08.2013    source источник


Ответы (1)


C # поддерживает только одинарное наследование, то есть каждый класс может расширять только один из одного суперкласса. Однако у вас есть MyTableClass расширение DataTable в первом partial классе и IDetailTable во втором. Вот что вызывает ошибку компиляции.

Я думаю, что вы действительно пытаетесь понять, что второй класс partial должен фактически extend из класса определения wsdl. Так что я бы изменил

public partial class MyTableClass : IDetailTable

to

public class MyAwesomeTableClass : MyTableClass
person musical_coder    schedule 24.08.2013
comment
Я не совсем уверен, что вы хотите сделать, но не думаю, что это сработает. MyAwesomeTableClass не будет доступен в классе wsdl, и я не мог изменить этот класс. - person Max; 26.08.2013
comment
Я думаю, вам нужно прояснить, что у вас есть сейчас и что вы хотите с этим делать. Какие именно классы нельзя изменить, и какие пользовательские классы вы хотите расширить от неизменяемых? - person musical_coder; 27.08.2013