我知道類實現中的shadowing成員可能會導致出現「錯誤」成員可以調用的情況,這取決於我如何投射我的實例,但使用接口我沒有看到這可能是一個問題,我發現我自己寫接口這樣往往:隱藏.NET中的繼承通用接口成員:好,壞或醜?
public interface INode
{
IEnumerable<INode> Children { get; }
}
public interface INode<N> : INode
where N : INode<N>
{
new IEnumerable<N> Children { get; }
}
public interface IAlpha : INode<IAlpha>
{ }
public interface IBeta : INode<IBeta>
{ }
我在我的代碼的地方,只有瞭解INode
所以兒童更應INode
類型。
在其他地方我想知道的具體類型 - 在我的例子的實施IAlpha
& IBeta
接口我希望兒童被鍵入相同的父母。
所以我實現NodeBase
類,像這樣:
public abstract class NodeBase<N> : INode<N>
where N : INode<N>
{
protected readonly List<N> _children = new List<N>();
public IEnumerable<N> Children
{
get { return _children.AsEnumerable(); }
}
IEnumerable<INode> INode.Children
{
get { return this.Children.Cast<INode>(); }
}
}
在實際執行中沒有陰影,只是在接口。
的IAlpha
& IBeta
看起來就像這樣的具體實例:
public class Alpha : NodeBase<Alpha>, IAlpha
{
IEnumerable<IAlpha> INode<IAlpha>.Children
{
get { return this.Children.Cast<IAlpha>(); }
}
}
public class Beta : NodeBase<Beta>, IBeta
{
IEnumerable<IBeta> INode<IBeta>.Children
{
get { return this.Children.Cast<IBeta>(); }
}
}
再次,在實施方式中沒有陰影。
我現在可以訪問這些類型的,像這樣:
var alpha = new Alpha();
var beta = new Beta();
var alphaAsIAlpha = alpha as IAlpha;
var betaAsIBeta = beta as IBeta;
var alphaAsINode = alpha as INode;
var betaAsINode = beta as INode;
var alphaAsINodeAlpha = alpha as INode<Alpha>;
var betaAsINodeBeta = beta as INode<Beta>;
var alphaAsINodeIAlpha = alpha as INode<IAlpha>;
var betaAsINodeIBeta = beta as INode<IBeta>;
var alphaAsNodeBaseAlpha = alpha as NodeBase<Alpha>;
var betaAsNodeBaseBeta = beta as NodeBase<Beta>;
每一個變量,現在有正確的,強類型Children
集合。
所以,我的問題很簡單。界面成員使用這種模式的陰影是好的,壞的還是醜陋的?爲什麼?
爲什麼不簡單地使用類型參數來確定一個孩子的類型。然後INode仍然有相同的語法,但你根本不需要影子 –
@Rune - 你是什麼意思的「類型參數」? – Enigmativity
@Enigmativity:我編輯了我的答案,以簡化NodeBase的INode.Children實現 - 我已經找出了我之前缺少的東西。 –