2016-01-14 2 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 не принимает «{get; set;}» с «= новым списком ...». Если я удалю «{get; set;}», он говорит: «Обозначение Themodifier недействительно для этого элемента». –

+0

@ KommissarFahrner Ответ в синтаксисе C# 6.0. – Maarten

+0

Хорошо, но ответ был, тем не менее, очень полезным для моего понимания! –