簡體   English   中英

為什么我不能在接口上調用ToString()?

[英]Why can't I call ToString() on an interface?

我在示例控制台應用程序中重新創建了這個問題,所以我很想知道發生了什么。

最初的問題是,在我的代碼中,我有一個名為ICat的類,這個類是用C#編寫的

public interface ICat
{
  string ToString(CatColour colour);
}

在同一個程序集中,在C#中有一個實現:

public class MagicCat : ICat
{
        public string ToString(CatColour colour)
        {
            return $"I am a {colour} cat";
        }
}

這編譯沒有任何問題。

在另一個用VB.NET編寫的程序集中,我有這樣的代碼:

Dim myCat As ICat = GetCat()
Dim result = myCat.ToString() ' Error on this line

這給出了編譯器錯誤,說明Argument not specified for parameter 'colour' of 'Function ToString(format As AddressFormat) As String'.

我嘗試在C#應用程序中重新創建此代碼,使用以下代碼:

public class Cat : IAnimal
{
    public string ToString(CatColour colour)
    {
        return $"I am a {colour} cat.";
    }

    //public string ToString()
    //{
    //    return "I am a cat.";
    //}
}

public interface IAnimal
{
    string ToString(CatColour colour);
}

class Program
{
    static void Main(string[] args)
    {
        IAnimal cat = new Cat();

        Console.WriteLine(new Cat().ToString());
        Console.WriteLine(new Cat().ToString(CatColour.Red));

        Console.WriteLine(cat.ToString());
        Console.WriteLine(cat.ToString(CatColour.Blue));

        Console.ReadKey();
    }
}

public enum CatColour
{
    Red = 1,
    Blue = 2
}

它編譯並運行,輸出為:

ConsoleApplication1.Cat
我是一只紅貓。
ConsoleApplication1.Cat
我是一只藍貓。

(如果我取消注釋其他ToString()方法,則第一行是> I am a cat.

這是我期望的。

我將應用程序轉換為VB.NET,期望得到上面的原始錯誤,但我得到了這個問題:

Public Class Cat
    Implements IAnimal
    Public Function ToString(colour As String) As String
        Return "I am a {colour} cat."
    End Function
End Class

Public Interface IAnimal
    Function ToString(colour As String) As String
End Interface

Class 'Cat' must implement 'Function ToString(colour As String) As String' for interface 'IAnimal'

那么這里發生了什么? 為什么VB.NET在我的界面實現中給我一個錯誤,為什么我的原始場景抱怨沒有不帶參數的ToString()方法?


編輯:我已將我的vb代碼更新為:

 Public Interface IAnimal Function ToString(colour As String) As String End Interface Public Class Cat Implements IAnimal Public Function ToString(colour As String) As String Implements IAnimal.ToString Return "I am a {colour} cat." End Function End Class Sub Main() Dim cat As Cat = New Cat() Dim icat As IAnimal = New Cat() Call cat.ToString() End Sub 

Argument not specified for parameter 'colour' of 'Public Function ToString(colour As String) As String' ,這是原始問題,在C#代碼中沒有出現。 知道為什么嗎? Cat是一個對象,因此它上面有一個空白的ToString()方法。

您必須添加更多信息:

Public Class Cat
     Implements IAnimal
     Public OverLoads Function ToString(colour As String) As String Implements IAnimal.ToString
         Return $"I am a {colour} cat."
     End Function
End Class

Public Interface IAnimal
    Function ToString(colour As String) As String
End Interface

要么

Public Class Cat
     Implements IAnimal
     Public Function MyToString(colour As String) As String Implements IAnimal.ToString
         Return $"I am a {colour} cat."
     End Function
End Class

您可能希望使用參數聲明ToString() Overloads (因為您有從Object派生的另一個基本ToString() )並且不使用從Object派生的參數Overrides ToString()

Public Class Cat
    Implements IAnimal
    Public Overloads Function ToString(colour As String) As String Implements IAnimal.ToString
        Return "I am a {colour} cat."
    End Function
    Public Overrides Function ToString()
        Return "I am a cat."
    End Function
End Class

Public Interface IAnimal
    Function ToString(colour As String) As String
End Interface

或者,您可以為IAnimal創建兩個ToString() ,並且不使用IAnimal參數而不是Object來覆蓋ToString()而不使用參數

Public Class Cat
    Implements IAnimal
    Public Overloads Function ToString(colour As String) As String Implements IAnimal.ToString
        Return "I am a {colour} cat."
    End Function
    Public Overrides Function ToString() As String Implements IAnimal.ToString
        Return "I am a cat."
    End Function
End Class

Public Interface IAnimal
    Function ToString(colour As String) As String
    Function ToString() As String
End Interface

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM