我有两个接口和一个实现:IState
,IEditableState
和State
,其中我有一个名为Value
的整数属性。
我想使用IState
获取此属性,IEditableState
使用设置。
我的代码看起来如此:
interface IState { int Value { get; } }
interface IEditableState:IState { int Value { set; } }
class State:IEditableState {
int Value { get; set; }
}
显然,我收到警告,IEditableState.Value
隐含地隐藏了IState.Value
,并且为了清楚起见,我应该添加关键字new。直觉上,这是相同的属性,所以我不明白为什么它应该是新的。
这样做的“干净”方式是什么?
答案 0 :(得分:1)
这种做法怎么样?使用方法而不是属性实现接口,然后在State
中显式实现接口,并在属性Value
后面抽象方法调用。这是一个代码示例:
interface IState { int GetValue(); }
interface IEditableState : IState { void SetValue(int value); }
class State : IEditableState
{
public int Value
{
get
{
return (this as IState).GetValue();
}
set
{
(this as IEditableState).SetValue(value);
}
}
private int _value;
int IState.GetValue()
{
return _value;
}
void IEditableState.SetValue(int value)
{
_value = value;
}
}
答案 1 :(得分:1)
在接口中,无法定义虚拟/覆盖,因此您使用.js
实现继承接口 - 在类中,这也意味着new
和{ {1}}并排,即使后者总是引用前者。
或者,这确实出现在.NET框架本身中,并且通过为Value { get; set; }
变体设置单独的界面(例如使用IList<T>
和IReadOnlyList<T>
而不是继承的接口;这允许实现具有单个属性,以满足两者中具有相同名称的项目。
答案 2 :(得分:0)
需要“new”关键字,因为基本接口和继承接口中的属性名称相同,并且您还没有覆盖基接口的属性。在这种情况下,您需要指定新关键字。在这种情况下,您将隐藏基接口的属性,即您将只能使用派生接口的属性。
另一种方法是定义两个具有不同名称的独立属性,如下所示:
sqoop import -m -1 --driver com.vertica.jdbc.Driver --connect "jdbc:vertica://serverName:5443/DBName" --username "user" --password "pass" --query 'select id, name from contacts limit 10' --target-dir "folder/contacts" --hive-import --create-hive-table --hive-table db.contacts