2

我知道我应该更广泛地使用它,但是我们的代码只有少数几个接口,所以我对它们有点菜鸟。这是我的问题。在文件一中,我有这个:

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,所以看起来应该是合法的。

我知道我在这里遗漏了一些愚蠢的东西......

4

2 回答 2

3

您必须使用与接口完全相同的类型来实现属性 - 所以

Friend Property StartDate() As DateRow Implements IAmountRow.StartDate

应该

Friend Property StartDate() As IDateRow Implements IAmountRow.StartDate
于 2018-11-08T22:03:33.077 回答
0

界面是一种身份。假设 IDateRow 位于“A.dll”中,实现它的 DateRow 位于“B.dll”中。并假设 A.dll 中有一个输入 IDateRow 实例的函数。由于 A.dll 没有引用 B.dll,所以它不知道 DateRow 是什么。因此,它需要一个具有“Property 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());
于 2018-11-09T20:08:52.537 回答