[英]Can separate access modifiers be specified for the get and set accessors of a property?
[英]Can Get/Set accessors of property to be in different interfaces?
我想要类似下一个的东西:
interface INamedObject
{
string Name { get; }
}
interface IRenamableObject : INamedObject
{
string Name { set; }
}
换句话说,我想创建两个接口,其中一个包含属性的get访问器,另一个包含set访问器。 我可以在C#中执行此操作吗?
(代码可以编译,但是编译器会发出以下警告:)
“ IRenamableObject.Name”隐藏继承的成员“ INamedObject.Name”。 如果要隐藏,请使用new关键字。
你当然可以:
interface INamedObject
{
string Name { get; }
}
interface IRenamableObject : INamedObject
{
new string Name { set; }
}
class SomeObject : IRenamableObject
{
public string Name { get; set; }
}
// usage:
IRenamableObject obj = new SomeObject();
obj.Name = "some name";
Console.WriteLine((obj as INamedObject).Name);
这是个好主意吗? 我不想在我的代码中使用它。 在我看来,当您遇到这种奇怪的情况时,也许表明存在某个设计缺陷。 一种迹象表明,您确实会收到警告,其中一个界面中的Name
掩盖另一个界面,因此您需要new
关键字,我通常认为这是一种解决方法,而不是解决方案。
请注意,接口可以完全彼此分离:
interface INamedObject
{
string Name { get; }
}
interface IRenamableObject
{
string Name { set; }
}
这将消除阴影问题。 它还将允许您拥有一个对象,该对象的Name
属性是只写的,这也有点奇怪...
中定义的属性IRenamableObject
将隐藏在一个INamedObject
。 您需要使用
interface IRenamableObject : INamedObject
{
new string Name { get; set; }
}
是的,您可以在两个不同的界面中具有“获取”和“设置”属性。
但是,主要问题是为什么您需要这种方式?
它可以编译,并不意味着它是正确的设计。
interface INamedObject
{
string Name { get; }
}
interface IRenamableObject //: INamedObject No need to inherit
{
string Name { set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.