你能在一个接口中定义类实现吗?
例如(伪代码警报!)...
interface IClass1
{
String s { get; set; }
// classes implementing this interface has to implement Class2 as "SubClass"
Class2 SubClass;
}
interface IClass2
{
Int32 i { get; set; }
}
class Class1 : IClass1
{
String IClass1.s { get; set; }
class IClass1.Class2 SubClass
{
Int32 IClass2.i { get; set; }
}
}
发布于 2010-10-05 21:08:31
不是的。另外,Class2不是一个子类,它是一个嵌套类或内部类。“子类”(在这个上下文中,还有其他完全不同的上下文)是派生类的另一个名称,在这个名称中,基类被称为“超类”(这就是为什么Java有一个类似于C#中的base
的关键字super
,虽然有一些不同)。“派生的”和“基础的”是C#中更流行的术语,也许是因为它们在C++中更受欢迎,也许是因为Bjarne Stroustrup说他觉得它们令人困惑,甚至他搞不清哪个是哪个(毕竟,这个子类有一个行为超集,反之亦然)。
内部类本质上将其包含的类用作命名空间,而接口仅详细说明成员方法和属性。
发布于 2014-02-26 17:44:10
如果我误解了,很抱歉,但是,是的,我现在就这样做( .NET 4.0和4.5的VB2013)。接口可以定义属性,属性可以很复杂,其类定义可以嵌套在接口定义中。在实现接口的类中,只能对整个复杂对象使用getter/setter,而不能对其单个属性使用getter/setter。(这些方法的getter/setter当然在类定义中)。工作示例从VB附加,以及未经测试的转换为C#。
VB:
Interface IPrintable
Property Body As DocBody
Class DocBody
Property Text As String
Property FontSize As Single
End Class
End Interface
Class WordDoc
Implements IPrintable
Public Property WordBody As IPrintable.DocBody Implements IPrintable.Body
End Class
和C#:
interface IPrintable
{
DocBody Body { get; set; }
public class DocBody
{
public string Text { get; set; }
public float FontSize { get; set; }
}
}
class WordDoc : IPrintable
{
public IPrintable.DocBody WordBody { get; set; }
IPrintable.DocBody IPrintable.Body {
get { return WordBody; }
set { WordBody = value; }
}
}
发布于 2020-05-23 17:19:28
我无法评论,但这个问题的公认答案不再准确。从C#8开始,可以为接口方法定义默认实现。由于接口没有私有成员,这仅限于调用其他公共成员,因此对于定义相互调用的方法重写非常有用。
https://stackoverflow.com/questions/3863817
复制相似问题