假设我有一个如下界面。
interface CardHolder : IEnumerable<Card>
{
/// <summary> ...
void PutCard(Card card);
/// <summary> ...
void PutCards(Card[] card);
/// Some more methods...
}
我按如下方式实现。
public class ArrayCardHolder : CardHolder
{
private Card[] _cards;
private int _size = 0;
public ArrayCardHolder(int capacity)
{
_cards = new Card[capacity];
}
public void PutCard(Card card)
{
if (IsFull())
throw new Exception("This CardHolder is full. Capacity: " + Capacity());
_cards[_size++] = card;
}
public void PutCards(Card[] cards)
{
if (_size + cards.Length > _cards.Length)
throw new Exception("Adding the Cards would exceed this CardHolder its capacity. Capacity: " + Capacity());
for (int index = 0; index < cards.Length; index++)
_cards[_size++] = cards[index];
}
public IEnumerator<Card> GetEnumerator()
{
for (int index = 0; index < _size; index++)
yield return _cards[index];
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
///More methods.
}
为什么我不能使用override
我的关键字ArrayCardHolder
(e.g. public void override PutCard(Card card) { ///implementation }
表明该方法实现(即覆盖)接口?在这种情况下,该项目将拒绝建设。
为什么它在覆盖时有效ToString()
?为什么在实施时不起作用CompareTo(T t)
from IComparable<T>
?
我应该用什么来代替?我担心接口中的文档不适用于我的实现方法。在 Java 中就是这样的情况,当@Override
使用注释。
接口的方法不是被覆盖, 他们是实施的。你很困惑抽象/虚拟方法可以被覆盖。
Example:
public interface IFoo
{
void DoA();
}
public abstract class BaseFoo : IFoo
{
public void DoA() { } // *this HAS to be implemented*
public virtual void DoB() { }
}
public abstract class MyFoo : BaseFoo
{
// *this CAN be implemented, which would override the default implementation*
public override void DoB() { }
}
正如其他人提到的,ToString
is a virtual
基类的方法object
,这就是为什么你可以override it.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)