如果我們這樣做:
,首先創建一個簡單的界面
public interface IOptional<T>: IEnumerable<T> {}
而寫的實施是
public class Maybe<T>: IOptional<T>
{
private readonly IEnumerable<T> _element;
public Maybe(T element)
: this(new T[1] { element })
{}
public Maybe()
: this(new T[0])
{}
private Maybe(T[] element)
{
_element = element;
}
public IEnumerator<T> GetEnumerator()
{
return _element.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
此之後,我們做了一些變化,您的節點
public class Node<E> : IPosition<E>
{
private IOptional<E> element;
public Node<E> PrevNode { get; set; }
public Node<E> NextNode { get; set; }
//Constructor
public Node(IOptional<E> e, Node<E> p, Node<E> n)
{
element = e;
PrevNode = p;
NextNode = n;
}
}
並使用Node類裏面
Node<E> n = new Node<E>(
new Maybe<E>(),
null,
null
);
沒有更多null檢查在這一領域
而是這個
if (this.element != null) { .. }
寫的這樣
this.element.Select(e => { doSomething(e); return true; })
這樣
if (this.element.Any())
{
var elem = this.element.First();
// do something
}
或寫入一個小的延伸方法
public static IOptional<TOutput> Match<TInput, TOutput>(
this IEnumerable<TInput> maybe,
Func<TInput, TOutput> some, Func<TOutput> nothing)
{
if (maybe.Any())
{
return new Maybe<TOutput>(
some(
maybe.First()
)
);
}
else
{
return new Maybe<TOutput>(
nothing()
);
}
}
,做這樣
var result = this.element
.Match(
some: e => e.ToString(),
nothing:() => "Ups"
)
.First();
C#允許泛型與原始類型一起使用,而Java只允許引用類型與泛型。所有的引用類型都可以爲null,所以它可以在Java中使用。 – 4castle
'Node n = new Node(null,null,null);'你必須提供特定類型才能工作。 – dcg
'我不需要默認(E)'你不是嗎?那怎麼不*完全*你想要什麼? – Servy