str*_*ger 18 c# inheritance interface
我希望通过为该接口中的属性提供set访问器来"扩展"接口.界面看起来像这样:
interface IUser
{
string UserName
{
get;
}
}
Run Code Online (Sandbox Code Playgroud)
我想要这样的东西:
interface IMutableUser : IUser
{
string UserName
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
我需要继承权.我不能复制的身体IUser进入IMutableUser并添加set访问.
这可能在C#中吗?如果是这样,怎么办呢?
Chr*_*fer 14
我没有看到你发布的内容不起作用的任何理由?刚做了一个快速测试,它编译好了,但是发出了关于隐藏的警告.这可以通过添加new关键字来修复,如下所示:
public interface IMutableUser : IUser
{
new string Username { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是添加显式集合方法; 例如:
public interface IMutableUser : IUser
{
void SetUsername(string value);
}
Run Code Online (Sandbox Code Playgroud)
当然,我更喜欢使用setter,但如果不可能,我想你会做你必须做的事情.
你可以使用一个抽象类:
interface IUser
{
string UserName
{
get;
}
}
abstract class MutableUser : IUser
{
public virtual string UserName
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
另一种可能性是:
interface IUser
{
string UserName
{
get;
}
}
interface IMutableUser
{
string UserName
{
get;
set;
}
}
class User : IUser, IMutableUser
{
public string UserName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
您可以通过显式实现接口来"覆盖"接口中的属性.克里斯的答案可能就是你所概述的场景所需要的所有内容,但考虑一个稍微复杂的场景,你需要在你的类上使用getter/setter,但界面只定义了getter.您可以通过执行以下操作来解决此问题:
public class MyUser : IUser
{
IUser.MyProperty { get { return "something"; } }
public MyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
通过明确实施IUser.MyProperty,您满足合同.但是,通过提供public MyProperty,对象的API将永远不会显示显式接口版本,并且将始终将MyProperty与get/set一起使用.