4

我没有完全理解使用接口,所以我不得不问:-)

我使用了一个 BaseClass,它实现了 IBaseClass 接口。这些接口只包含一个声明:

public interface IBaseClass
{
    void Refresh ();
}

所以我在我的 Baseclass 中实现了一个 Refresh 方法:

    public void Refresh ()
    {
        Console.WriteLine("Refresh");
    }

现在我想使用一些从这些 Baseclass 扩展并实现 IBaseClass 接口的类:

    public class ChildClass : BaseClass,IBaseClass
    {
    }

但是在我的 BaseClass 中实施“刷新”的原因我不必再次实施该方法。我应该怎么做,强制“刷新”的实现到 BaseClass 的所有子类以及子类的所有子类中。

谢谢古奇

4

6 回答 6

4

您不能强制派生类以您指定的方式重新实现该方法。你有三个选择:

  1. 不要refresh在基类中定义。该接口将强制子类实现它。
  2. 如果接口的唯一目的是强制实现并声明基类abstract以及refresh,请避开接口,您不会为此提供实现。
  3. refresh在基类中定义为virtual. 这允许覆盖但不会强制它们。这是如何ToString()工作的。

这一切都假设您的基类大于单个方法。如果确实您的代码正是您发布的内容,那么 Oded 的答案是最佳选择。

于 2012-12-11T10:14:15.880 回答
3

What should I do, to force the implementation of "Refresh" into all childs of BaseClass as well as all childclasses of childclass.

Like this:

interface IBase
{
    void Refresh();
}

abstract class BaseClass : IBase
{
    public abstract void Refresh();
}

class ChildClass : BaseClass
{
    public override void Refresh()
    {
        // Your code
    }
}

You can even omit the interface (my rule of thumb: if an interface gets implemented by exactly one class, dump the interface. Don't cling on to interfacitis. An abstract class quite much represents an interface, see also Interface vs Abstract Class (general OO)).

If you do need an implementation in the base class, build it as such:

(abstract) class BaseClass ( : IBase)
{
    public virtual void Refresh()
    {
        // Your code
    }
}

Which you can then call from your derived classes:

public override void Refresh()
{
    // Your code

    // optionally, to call the base implementation:
    base.Refresh();
}
于 2012-12-11T10:19:53.513 回答
3

简单的。不要提供基类实现,您必须在每个继承类中实现该方法。

实现这一目标的一种方法是进行BaseClass 抽象

public abstract BaseClass : IBaseClass
{
    public abstract void Refresh();
}
于 2012-12-11T10:14:24.007 回答
1

If you want to supply a default implementation, do it in your base class by marking it as virtual, so you can override that implementation in subclasses if you want.

Otherwise mark the method as abstract in your base class, so your subclasses are forced to implement the method themselves.

于 2012-12-11T10:18:50.427 回答
1

让我们一步一步来看看。

1:你有一个定义你的代码合约的接口,定义如下:

public interface IBase
{
    void Refresh();
}

2:你有一个实现你的接口的基类。(您会注意到刷新的实现是virtual。这允许您在派生类中覆盖此方法)。

class Base : IBase
{
    public virtual void Refresh()
    {
        //Implementation
    }
}

3:你有一个派生自 Base 的超类。(您会注意到派生类不需要显式实现IBase,因为它是在较低级别完成的。我将向您展示您可以测试它的完整性)。

class Child : Base
{
    public override void Refresh()
    {
        base.Refresh(); //You can call this here if you need to perform the super objects Refresh() before yor own.
        //Add your implementation here.
    }
}

在这一点上,你可能会想;“好的,那么 Child 是如何实现 IBase 的? ”。答案是它是通过Base间接实现的,因为Child继承Base了,它也得到了IBase.

因此,如果你要写:

IBase instance = new Child();

这是完全合法的,因为本质上是间接Child衍生的。IBase

如果您想对此进行测试,可以在代码中执行此操作:

bool canAssign = typeof(IBase).IsAssignableFrom(typeof(Child));
//canAssign should be true as Child can be assigned from IBase.
于 2012-12-11T14:33:51.287 回答
0

可能是关键字可以帮助你;

namespace ConsoleApplication1
{
    interface IBase
    {
        void Referesh();
    }
    public class Base1 : IBase
    {
        public void Referesh()
        {
            Console.WriteLine("Hi"); 
        }
    }
    public class Class1 : Base1, IBase
    {
        public new void Referesh()
        {
            Console.WriteLine("Bye");
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            Class1 obj = new Class1();
            obj.Referesh();

            Console.ReadKey();
        }
    }
}
于 2012-12-11T10:51:08.517 回答