gpt4 book ai didi

c# - 允许向接口(interface)属性添加访问器,但不允许向抽象属性添加访问器

转载 作者:太空狗 更新时间:2023-10-29 22:53:42 25 4
gpt4 key购买 nike

为什么以下是合法的 C#:

public interface ISomeInterface
{
int SomeProperty
{
get;
}
}

public class SomeClassImplementingInterface : ISomeInterface
{
public int SomeProperty
{
get { return 32; }
protected set {}
}
}

但这不是:

public abstract class SomeAbstractClass
{
public abstract int SomeProperty
{
get;
}
}

public class SomeClassExtendingAbstractClass : SomeAbstractClass
{
public override int SomeProperty
{
get { return 32; }
protected set {}
}
}

后者会导致以下编译时错误:

'InterfaceAbstractTest.SomeClassExtendingAbstractClass.SomeProperty.set': cannot override because 'InterfaceAbstractTest.SomeAbstractClass.SomeProperty' does not have an overridable set accessor InterfaceAbstractTest

不禁止后者而允许前者的原因是什么?

最佳答案

因为使用接口(interface)的调用者只关心接口(interface)的实现者至少实现了接口(interface)的定义,如@davisoa 所述,而 SomeAbstractClass 在您的示例中定义了一个明确规定成员的类型、可访问性和(对于属性)可读/可写性的公共(public)契约。

如果您使用反射获取 SomeProperty 的 PropertyInfo(从基类或子类),它需要从某处解析该信息。允许子类更改可读性/可写性将与更改返回类型或参数列表一样违反契约(Contract)。

想象一下:

SomeAbstractClass sc = new SomeClassExtendingAbstractClass();
PropertyInfo pi = sc.GetType().GetProperty("SomeProperty");
Console.Out.WriteLine(pi.CanWrite); // What should be printed here?

关于c# - 允许向接口(interface)属性添加访问器,但不允许向抽象属性添加访问器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9365003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com