我理解“new”关键字如何隐藏派生类中的方法.但是,它对实现使用关键字的接口的类有什么影响?
考虑这个例子,我决定通过使其属性读/写来扩展接口.
public interface IReadOnly { string Id { get; } } public interface ICanReadAndWrite : IReadOnly { new string Id { get; set; } }
然后你就可以做到这样的事情:
public IReadOnly SomeMethod() { // return an instance of ICanReadAndWrite }
这是不好的设计吗?它会导致我的类实现ICanReadAndWrite的问题吗?
编辑:这是一个人为的例子,说明我为什么要这样做:
假设我有一个返回IShoppingCartItemReadWrite的工厂类.然后,我可以有一个服务层来操作它的价格,更改东西等.然后,我可以将这些对象作为IShoppingCartItemReadOnly传递给某种不会改变它们的表示层. (是的,我知道它在技术上可以改变它们 – 这是一个设计问题,而不是安全性等)
解决方法
这不是一个特别糟糕的主意.您应该知道实现者可以(如果它隐式实现接口,那么单个读/写属性可以满足两个接口)提供两个不同的实现:
class Test : ICanReadAndWrite { public string Id { get { return "100"; } set { } } string IReadOnly.Id { get { return "10"; } } } Test t = new Test(); Console.WriteLine(t.Id); // prints 100 Console.WriteLine(((IReadOnly)t).Id); // prints 10
顺便说一下,一般来说,新的继承修饰符除了告诉编译器关闭并且不抛弃“你隐藏该成员”警告之外什么都不做.省略它将对编译的代码没有影响.