English 中文(简体)
如何在抽象的基础类别中部分执行合同?
原标题:How to partially implement a contract in an abstract base class?
  • 时间:2010-07-22 18:39:39
  •  标签:
  • c#
  • .net

我有以下接口:

 public interface IX
    {
        void MethodA();
        void MethodB();
    }

我在界面方法与方法B中有两个方法合同。 我将界定实施上述接口的一组类别。 在这两种方法中,方法A对于实施接口的所有类型都很常见。 我可以确定一个抽象的类别如下:

public abstract class XBase:IX
    {
        public void MethodA()
        { 
            // Common behaviour implementation
        }

        public abstract void MethodB();
    }

并且将这一类别继承到需要实施上述接口的所有类型。 它行之有效。

但此处为抽象的类别,即增加公开的抽象方法B(); 它看上去方法B合同的重复。

如果“C#”这一类别是抽象的,那么为什么C#不能允许部分接口的实施? 上述接口只有两种方法。 假设一个接口有10种方法,5种是通用功能,5种不是,我们被迫增加5种在抽象类别中并不常见的方法?

最佳回答

因为C#语言说明就是这样。 第13.4.7章:

与非直接类别一样,一个抽象的类别必须提供本类基本类别清单中所列的所有接口成员的履约情况。

为什么C#设计师选择具体使用类似语言,可能最好由Eric Lippert回答。 我亲自猜测,要减少意外隐藏方法的奇迹,产生难以解释的错误信息。 我个人本来会更加舒适,要求使用接口方法使用压倒性的关键词。 但是他们选择不这样做。

问题回答

之所以不支持这一点,是因为你的上司没有履行合同。 抽象类别迫使其分流执行的唯一办法是界定抽象的方法。

如果你不想抽象的类别来界定这些抽象的方法,那么你就不得不告诉子类去实施接口。

问题必须是,为什么在你的超级阶级上存在5个抽象方法的问题?

接口按照合同要求相互通过,只要您有<代码>。 Internationaloo and IBar : FIoo, 然后从上继承。 IBar必须实施这两个接口,因为I Bar不能执行的成员 红十字与红新月联会。 我不知道为什么不能将这种行为扩大到抽象的基类。 我确信存在一个很好的理由,由于汉斯登出了这一幽灵,这显然是蓄意的。

作为,请不要在的家中尝试。 你们可以采取这样的做法。

class Derived : Base, IFoo
{
    public void MethodB()
    {
    }
}

abstract class Base
{
    public Base()
    {
        if (!(this is IFoo))
            throw new InvalidOperationException("must implement IFoo");
    }

    public void MethodA() { }
}

interface IFoo
{
    void MethodA();
    void MethodB();
}

具有抽象的基础,可实施它想要采用的方法,然后迫使衍生类别执行其余部分,办法是执行衍生类别。 然后,衍生课程将负责执行本基类尚未采用的方法。 这种做法的问题在于,这是一个临时要求,而不是汇集时间。

如何处理你所处的情况

interface IFoo {
  void MethodA();
  void MethodB();
}
abstract class Base: IFoo {
  public void MethodA() {}
  // MethodB gets implicitly generated
}
class Derived: Base {
  public void MethodB() {}
}

您:

Base myBase = ...
myBase.MethodB();

您可以,因为<代码>MethodB是默示的。 但是,如果你后来决定从<代码>Base类别中删除接口<编码>。 页: 1 基础的合同.Solution是,产生的方法将是明确的接口执行,但又造成另一种痛苦。

你们可以在方法申报中从抽象的到虚拟的转变,并提供以下断言:

public abstract void MethodB();

......

public virtual void MethodB()
{
    Contract.Require( your condition );
}

我不考虑抽象的等级或接口在您的情景中,而不是按照SOLID原则(具体地说:Interface Segregation Principle)行事:

它说,大型接口应当分为较小和更为具体的接口,以便客户班不会被迫采用根本不使用的方法。 采用这一原则将解决你的问题。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签