C#抽象基类中的属性

6

我遇到了一个奇怪的问题,无法解决。当我尝试编译以下代码片段时,会出现以下错误:

'AbstractClass'未实现接口成员'Property' (编译器错误CS0535)

在线帮助告诉我要将我的AbstractClass声明为抽象类,但它已经是抽象类了。有人能告诉我错在哪里吗?

谢谢 Rüdiger

public interface IBase {
    string Property { get; }
}

public abstract class AbstractClass : IBase
{
    public override string ToString()
    {
        return "I am abstract";
    }
}

public class ConcreteClass : AbstractClass
{
    string Property { 
        get {
            return "I am Concrete";
        }
    }
}
7个回答

20

您的AbstractClass需要为IBase接口中的Property提供实现,即使它本身只是抽象的:

public abstract class AbstractClass : IBase
{
    public override string ToString()
    {
        return "I am abstract";
    }

    public abstract string Property { get; }
}

更新: Luke 正确指出具体实现需要指定 Property 是一个覆盖(override),否则会得到一个“未实现继承的抽象成员”错误:

public class ConcreteClass : AbstractClass
{
    public override string Property { 
        get {
            return "I am Concrete";
        }
    }
}

1
谢谢,显然解决了问题。我仍然在想为什么它似乎与抽象类中处理接口的通常方式不同。 - Rüdiger
你是什么意思?你的抽象类的子类不一定需要知道它实现了IBase,它只需看到可能/必须实现的虚拟和抽象成员。 - dahlbyk
3
你还需要在ConcreteClass中使用override修饰符来声明Property - LukeH
你是对的,dahlbyk。看来我误解了接口和抽象类的概念。我以为只有具体类需要实现基类的所有抽象和接口成员。 - Rüdiger
它对于实现接口的接口起作用,但抽象类的唯一特殊之处在于它可以拥有抽象方法并且不能直接构造。所有其他规则都适用。 - dahlbyk

3

您需要在AbstractClass中添加属性的抽象实现:

public abstract class AbstractClass : IBase
{
    public override string ToString()
    {
        return "I am abstract";
    }

    public abstract string Property { get; }

}

并在Concrete类中使用override关键字


2

你的抽象类没有实现接口IBase。只需将属性Property添加到AbstractClass中即可。

public abstract String Property { get; }

2
你需要在AbstractClass中声明Property,以满足IBase的要求。
如果你想让ConcreteClass能够重写Property,那么你应该将其声明为abstractvirtual。然后你需要使用override声明ConcreteClassProperty的实现。
    public interface IBase
    {
        string Property { get; }
    }

    public abstract class AbstractClass : IBase
    {
        public abstract string Property { get; }

        public override string ToString()
        {
            return "I am abstract";
        }
    }

    public class ConcreteClass : AbstractClass
    {
        public override string Property
        {
            get
            {
                return "I am Concrete";
            }
        }
    }

2

AbstractClass应该实现IBase接口,其中包含Property属性,而你还没有实现它。


1
你需要像这样实现IBase属性Property
public abstract class AbstractClass : IBase
{
    public override string Property()
    {
        return "This is the base-class implementation";
    }
}

或者将其抽象化


1

你必须在抽象类中实现属性 property。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接