2016-09-13 2 views
1

У меня есть следующие ситуации, но я чувствую, что я делаю что-то неправильно ... enter image description hereсделать интерфейс расширить класс

Я использовал интерфейс для Field согласно this сообщению. Интерфейс Field наследует от класса Style и Field1, 2 и 3 наследует от интерфейса Field. Я хочу построить объект Label с несколькими различными типами полей, каждый из которых имеет свой собственный стиль. Я не уверен, если я делаю это правильный путь, как это, особенно потому, что я получаю следующее сообщение об ошибке при попытке компиляции: Type 'Style' in interface list is not an interface

Мой код:

public interface Field : Style 
{ 
    int Xpos { get; set; } 
    int Ypos { get; set; } 
    int Zindex { get; set; } 
} 

Что является лучшим способом решить это?

EDIT

Я знаю, наследующий класс от интерфейса невозможно, но то, что было бы наилучшим подходом здесь?

+0

В случае если поле не имеет стиля - поэтому быть свойством. Вы действительно не хотите распространять стиль на поле. Но вы не можете заставить интерфейс наследовать класс. – Andez

+2

Интерфейсы не могут наследовать от класса, только от других интерфейсов. – juharr

+0

@juharr Я понял, хаха, но все равно спасибо! Как я могу улучшить это? – Markinson

ответ

0

Я думаю, где вы боретесь, это цель интерфейсов. Интерфейс определяет для класса, какие публичные элементы и методы будут существовать в классе реализации. Это позволяет вам создать переменную типа (имя вашего интерфейса), а затем присвоить ей значение любого экземплярированного класса, который реализует интерфейс.

Что касается улучшения вашего дизайна, ваши три свойства (x, y, z) могут быть определены в вашем интерфейсе и вашем классе ярлыков и реализовать ваш полевой интерфейс. Он не будет иметь список полей, но скорее его реализует, заставляя его иметь свойства x, y и z с помощью метода draw. тогда ваш стиль будет иметь список полей, в которые можно добавить что-либо, что реализует ваш полевой интерфейс. Затем вы можете уверенно перебирать этот список и вызывать ничью и знать, что он есть, независимо от того, что делает на самом деле.

1

Найти/создать интерфейс, который используется стилем и наследовать этот интерфейс в полевом интерфейсе.

Примечание. Интерфейс поля следует называть IField.

Если стиль вашего собственного класса

public interface IStyle 
{ 
    /* Style properties */ 
} 
public class Style : IStyle 
{ 
    /* Style implementations */ 
} 

public interface IField : IStyle 
{ 
    int Xpos { get; set; } 
    int Ypos { get; set; } 
    int Zindex { get; set; } 
} 

public class Field : Style, IField 
{ 
    public int Xpos { get; set; } 
    public int Ypos { get; set; } 
    public int Zindex { get; set; } 
} 
+0

Все мои классы созданы мной, поэтому я не имею в виду какие-либо существующие классы ;-) – Markinson

+0

Я обновил код с помощью примера создания интерфейса для стиля под названием IStyle. IStyle затем наследуется интерфейсом IField. Класс Field наследует класс Style и реализует интерфейс IField. –

0

Как это было сказано, интерфейс не может расширить класс, так что я попробую другой шаблон. Я не знаю, стандартно ли это, но когда речь идет о подобных сценариях, я выбираю шаблон «Интерфейс + базовый класс». Вы определяете:

  • интерфейса с минимальными полями/методами требуется
  • основания (необязательно абстрактный) класс с общей функциональностью,

Таким образом, если вы хотите, чтобы добавлять новые функции, которые вы можете выбрать между расширить базовый класс или реализовать интерфейс с нуля.

В вашем случае это зависит от направления возможных расширений, но пример структура может быть: интерфейс

  • IStyle
  • StyleBase абстрактный класс реализация IStyle и с абстрактным методом Draw
  • интерфейса
  • Ifield расширение IStyle
  • Исходный класс FieldBase, реализующий IField и с абстрактным методом рисования
  • Класс Label, расширяющий стильBase и с помощью Lis т
  • Field1, Field2, классы field3 расширения FieldBase

Как я уже сказал, что это только пример, это зависит от потенциала, простирающейся точки.

0

Когда наследование терпит неудачу или создает больше проблем, чем оно решает, композиция, скорее всего, путь.

Поскольку вы не очень много говорите о методе Draw(), я просто предполагаю, что это не относится к проблеме здесь.

Я думаю, что хороший способ решить вашу проблему здесь - составить как полевой интерфейс, так и класс Label со стилем.

Что я предлагаю что-то вроде этого:

public interface IField { 
    Style style {get;set} 
    /* Your property */ 
} 
public class Label { 
    Style style {get;set} 
    IField field {get;set} 
    /* Your property */ 
} 
Смежные вопросы