假设我有一个如下所示的界面。
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
(例如 public void override PutCard(Card card) { ///implementation }
表示该方法实现(即覆盖)接口(interface)?在这种情况下,项目将拒绝构建。
为什么它在覆盖 ToString()
时仍然有效? ?为什么在实现 CompareTo(T t)
时它不起作用来自 IComparable<T>
?
我应该改用什么?我担心接口(interface)中的文档不适用于我的实现方法。当 @Override
时,Java 就是这种情况。使用注释。
最佳答案
接口(interface)的方法不是覆盖,而是实现。您对可以覆盖的抽象/虚拟方法感到困惑。
例子:
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
是 virtual
基类的方法object
,这就是您可以覆盖它的原因。
关于c# - 为什么我不能覆盖我的接口(interface)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38273352/