【问题标题】:C#: Abstract List<string> [duplicate]C#:抽象列表<string> [重复]
【发布时间】:2016-04-19 22:35:01
【问题描述】:

C#: 我想用一个适用于字符串列表的方法编写一个抽象类。该列表将尚未在此类中实现。 然后我想写另一个类,继承自抽象类并实现字符串列表。

class AbstractClass 
{
    protected abstract List<string> myList; // To be implemented in a child class
    void ShowList()
    {
        foreach (string member in myList) 
        {
            Console.WriteLine(member);
        }
    }
}

class HelloWorld : AbstractClass
{
    new private List<String> myList = new List<string>()
    {
        "Hello", "World"
    }; 
}

现在 C# 告诉我“修饰符摘要在字段上无效。请尝试改用属性。” 我似乎没有得到大局。我只想要一个占位符/对我的基父类中的列表的引用。这是怎么做到的?

【问题讨论】:

  • 一个字段被认为是私有的。这意味着您不会在从基类继承的类中看到它,因此它无法实现它的字段版本。另一件事是 - 字段仅用于保存数据,您不能真正“实现”它们。尝试使用虚拟/抽象属性。
  • 为什么需要在派生类中“实现”它。您在抽象类中定义字段,然后在派生类中对其进行初始化。

标签: c# abstract


【解决方案1】:

您的代码存在几个问题。这将修复它们:

abstract class AbstractClass
{
    protected abstract List<string> MyList { get; set; } // To be implemented in a child class

    void ShowList()
    {
        foreach (string member in MyList)
        {
            Console.WriteLine(member);
        }
    }
}

class HelloWorld : AbstractClass
{
    protected override List<String> MyList { get; set; } = new List<string>()
    {
        "Hello", "World"
    };
}

问题:

  • 应使用abstract class 声明抽象类;
  • 如果要在派生类中覆盖其功能,则需要使用属性或方法;
  • 您使用的是new 关键字。如果您想在派生类中派生某些东西,请不要这样做!请改用override

【讨论】:

  • 谢谢,但它似乎不起作用。 VirtualStudio 2013 不接受带有“= new List...”的“{ get; set; }”。如果我删除“{ get; set; }”,它会一直说“Themodifier override is not valid for this item”。
  • @KommissarFahrner 答案是 C# 6.0 语法。
  • 好的,不过答案对我的理解还是很有帮助的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 2012-11-27
  • 2018-03-25
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
相关资源
最近更新 更多