【问题标题】:Must declare a body becase it is not marked abstract, extern or partial必须声明一个主体,因为它没有标记为抽象、外部或部分
【发布时间】:2010-07-28 16:11:30
【问题描述】:

我创建了以下课程。但是,我无法克服错误:

必须声明一个主体,因为它没有被标记为抽象、外部或部分

类如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.CompilerServices;

namespace VDSORDAL
{
        public abstract class ObjectComparer<T> : IComparer<T>
        {
            public ObjectComparer(string compareField, string direction);

            private string compareField; 

            public string CompareField 
            { 
                get { return compareField; } 
                set { compareField = value; } 
            }

            public string Direction
            { 
                get { return compareField; } 
                set { compareField = value;} 
            }

            public abstract int Compare(T x, T y);
        }
}

有人能以我的方式指出错误,并简要解释一下我做错了什么以及为什么会引发此错误吗?

【问题讨论】:

  • 您的 Direction 属性看起来不正确。我认为你需要一个“私人字符串方向”;就像 compareField 的一样。然后将 Direction 属性中的 compareField 替换为方向。
  • 没有。 Direction 属性很好。
  • 基本上,您不能有抽象构造函数——只需更改“;”到“{}”,它应该编译。

标签: c# class abstract-class


【解决方案1】:

你已经声明了没有主体的构造函数:

public ObjectComparer(string compareField, string direction);

如果你不希望构造函数做任何事情,你仍然可以在那里放一个空的 body ({ })。

附带说明一下,拥有一个带有公共构造函数的抽象类是没有意义的——the constructor should be protected,因为无论如何构造函数只能被派生自它的类“调用”。

【讨论】:

  • 意思是,你需要在大括号中添加一段代码来做某事。当一些代码调用 ObjectComparer 并将比较字段和方向字符串传递给它时,它可能需要创建一个对象并设置这些属性。
【解决方案2】:

你需要为

添加一个方法体
public ObjectComparer(string compareField, string direction);

我建议您对抽象类进行一些研究。 MSDN 是一个很好的起点,但通过 Google 快速搜索可以找到许多深入信息的来源。


由于问题已得到合理回答,我将添加一些额外的 cmets,因为您提供的代码看起来很糟糕。

using System.Web;
using System.Runtime.CompilerServices;

这些似乎是在比较器中使用的几个奇怪的命名空间(尤其是第二个),这个类是来自一个较大的文件而您没有得到所有的,还是只是遗留代码?


public ObjectComparer(string compareField, string direction);

我猜构造函数应该是这样设置属性的?

public ObjectComparer(string compareField, string direction)
{
    CompareField = compareField;
    Direction = direction;
}

public string Direction
{ 
    get { return compareField; } 
    set { compareField = value;} 
}

我认为这应该有它自己的支持领域。似乎很奇怪,它总是与 CompareField 相同。


我并不是要粗鲁,但是仅仅克服这个错误不会使这门课正常工作。您确实需要了解您正在尝试做什么以及这样的课程如何帮助您做到这一点。 (如果您知道所有这些并且只是不理解错误,那么我很抱歉)

【讨论】:

  • 你的意思是他需要 /abstract/ 方法的主体 "int Compare(T x, T y)...?;)
  • @AllenG - 不,他不是那个意思。你不能有一个带有身体的抽象功能。这就是使用抽象方法来强制子类实现自己的方法的全部原因。
  • @fletcher - 我首先输入了错误的答案,将比较方法包含为错误,没有注意到它是抽象的。幸运的是,我在编辑窗口中修复了它,现在唯一证明我愚蠢的是艾伦的评论和承认。
  • 不,马丁,你是完全正确的——需要大量阅读和理解!你对遗留代码是正确的。
  • 你好 Martin - 你说这个类不起作用也是正确的。我得到了错误的代码来剖析。我认为它应该做的事情看起来有点薄!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多