2016-01-14 82 views
0

C#: 我想写一个抽象类,其中包含一个对字符串列表起作用的方法。该名单将不会在这个班级实施。 然后我想编写另一个继承自抽象类并实现字符串列表的类。C#:Abstract List <string>

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#告诉我“修饰符摘要在字段上无效,请尝试使用属性。” 我似乎没有得到大局。我只想要一个占位符/对基本父类中的列表的引用。这是如何完成的?

+2

检查此链接:http://stackoverflow.com/questions/7490870/virtual-abstract-fields-in-c-sharp –

+0

一个字段被认为是私人的。这意味着你不会在继承自基类的类中看到它,因此它不能实现它的字段版本。另一件事是 - 领域只是为了保存数据,你不能“实现”它们。尝试使用虚拟/抽象属性。 –

+0

为什么它需要在派生类中“实现”。您可以在抽象类中定义该字段,然后在派生类中对其进行初始化。 – PaulF

回答

2

您的代码有几个问题。这将解决这些问题:

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
+0

谢谢,但它似乎没有工作。 VirtualStudio 2013不接受使用“= new List ...”的“{get; set;}”。如果我删除“{get; set;}”,它会一直说“修改器重写对此项无效”。 –

+0

@KommissarFahrner答案在C#6.0语法中。 – Maarten

+0

好的,但答案对我的理解非常有帮助! –