Запутался в наследовании интерфейса - PullRequest
0 голосов
/ 09 ноября 2018

Я знаю, что я должен использовать это гораздо шире, но в нашем коде есть только несколько интерфейсов, поэтому я немного недоволен ими. Вот моя проблема. В первом файле у меня есть это:

Friend Interface IDateRow
    Property Name() As String
    ...
End Interface
Friend Interface IAmountRow
    Property StartDate() As IDateRow
    Property EndDate() As IDateRow
    ...
End Interface

В файле 2 у меня есть это:

Friend Class DateRow
    Inherits DtaRow
    Implements IDateRow
    Friend Property Name() As String Implements IDateRow.Name
    ...
End Class

Пока все хорошо. Теперь ...

Friend Class AmountRow
    Inherits DtaRow
    Implements IAmountRow
    Friend Property StartDate() As DateRow Implements IAmountRow.StartDate

Это не будет работать - оно говорит:

'StartDate' cannot implement 'StartDate' because there is no matching property on interface 'IAmountRow'.

Правильно ли я считаю, что это потому, что он возвращает DateRow, а не IDateRow? DateRow реализует IDateRow, поэтому он кажется таким, каким он должен быть законным.

Я знаю, что мне здесь чего-то не хватает ...

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Интерфейс - это личность. Давайте предположим, что IDateRow находится в «A.dll», а DateRow, который его реализует, находится в «B.dll». И давайте предположим, что в A.dll есть функция, которая вводит экземпляр IDateRow. Поскольку A.dll не ссылается на B.dll, он не знает, что такое DateRow. Таким образом, он ожидает, что экземпляр с «свойством StartDate () As IDateRow» не является DateRow.

Редактировать - Моя попытка ответить на комментарий @ MauryMarkowitz:

Я думаю, что вы хотите абстрактный класс. Я написал пример на C #, но я думаю, что он похож на VB.

//A.dll -> has no reference
public abstract class Vehicle 
{
    public abstract double Mass();
    public abstract double Force();

    public double Acceleration()
    {
        return this.Force() / this.Mass();
    }
}
public interface ICar
{
    double MaxGroundSpeed();
}
public interface IPlane
{
    double MaxAirSpeed();
}


//B.dll -> has a reference to A.dll
public class Ferrari360 : Vehicle, ICar
{
    public override double Force()
    {
        return 400;
    }
    public override double Mass()
    {
        return 1350;
    }
    public virtual double MaxGroundSpeed()//Ferrari likes to make good cars, better, so this should be virtual.
    {
        return 282;
    }
}
public class Ferrari360GT:Ferrari360
{
    public override double Mass()
    {
        return 1100;
    }
    public override double MaxGroundSpeed()
    {
        return 300;
    }
}
public class Concorde : Vehicle, IPlane
{
    public override double Force()
    {
        throw new ClassifiedInformationException();
    }
    public override double Mass()
    {
        return 92080;
    }
    public double MaxAirSpeed()
    {
        return 2180;
    }
}
public class DeLoreanTimeMachine : Vehicle, ICar, IPlane
{
    public override double Force()
    {
        return 130;
    }
    public override double Mass()
    {
        return 1230;
    }
    public double MaxAirSpeed()
    {
        return 299792;
    }
    public double MaxGroundSpeed()
    {
        return 88;
    }
}

Пример использования:

Ferrari360 greatCar = new Ferrari360();
Console.WriteLine(greatCar.Acceleration());
0 голосов
/ 09 ноября 2018

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

Friend Property StartDate() As DateRow Implements IAmountRow.StartDate

Должно быть

Friend Property StartDate() As IDateRow Implements IAmountRow.StartDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...