[英]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()方法?
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.