2014-12-10 3 views
-3

В моем проекте у меня есть два класса: статья и новости. Некоторые поля в них одинаковы. Например: Title, Text, Keyword, MemberID, Date.Как слить два класса

Я создал интерфейс и поместил в него то же поле. Правильно ли это?

interface ITextContext 
{ 
    public int ID { get; set; } 
    public int Title { get; set; } 
    public string Text { get; set; } 
    public DateTime Date { get; set; } 
    List<Keyword> Keywords; 

} 

public class Article:ITextContext 
{ 
    public int ArticleID { get; set; } 
    public bool IsReady { get; set; } 
} 

public class NewsArchive:ITextContext 
{ 
    public int NewsArchiveID { get; set; } 
} 
+1

A [базовый класс] (http://stackoverflow.com/questions/15583896/how-to-decide-between-an-interface-or-base-class-for-an-new-implementation), вероятно, будет более подходящим здесь, если поведение членов не будет отличаться между классами «Archive» и «NewsArchive» –

+0

Это отчасти правильно, вам нужно будет реализовать эти члены интерфейса в каждом классе. Интерфейс является скорее инструкцией для остальной части кода, в которой класс будет содержать члены, определенные в интерфейсе. – gmiley

+0

если изменить iterface на Base Class, это правильно? –

ответ

0

В текущей реализации, свойства определены в ITextContext должны быть реализованы в Article и NewsArchive для компиляции. Это было бы справедливо, но не приводило бы к повторному использованию кода, которое, с другой стороны, не является целью интерфейса.

+0

, если использовать базовый класс вместо интерфейса, он будет основан на принципах проектирования и оо? –

+0

Это подлежит обсуждению и не может быть однозначно отреагировано. С одной стороны, интерфейс не может совместно использовать реализацию. С другой стороны, повторное использование кода не является основной целью наследования. По-моему, возможна реализация и реализация базового класса. – Codor

+0

ОК! Спасибо за вашу помощь . –

0

Это нормально, если вы не хотите делиться деталями реализации между классами. Например, если вы хотите добавить метод TextContext, который будет использован как статьи и НовостиМеждународныеАрхив, вы хотите, чтобы наследовать от базового класса вместо:

public class TextContext 
{ 
    public int ID { get; set; } 
    public int Title { get; set; } 
    public string Text { get; set; } 
    public DateTime Date { get; set; } 
    List<Keyword> Keywords;  

    public string SomeMethod() 
    { 
     return string.Format("{0}\r\n{1}", Title, Text); 
    } 
} 

public class Article : TextContext 
{ 
    ... 
} 
+0

Я думаю, что если лучше изменить метод SomeMethod() в Virtcual. не так ли? –

+0

Это, если вы хотите переопределить реализацию SomeMethod(), да. – Alan

+0

благодарит за вашу помощь. Я изменил интерфейс на базовый класс. –

0

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

Если вам нужно разделить некоторые реализации вы можете использовать абстрактные классы в том же, как вы делаете с интерфейсом (Абстрактный класс не может быть создан)

public abstract class TextContext 
{ 
    public int ID { get; set; } 
    public int Title { get; set; } 
    public string Text { get; set; } 
    public DateTime Date { get; set; } 
    List<Keyword> Keywords; 

    public int PlusOne(int a){ 
     return a+1; 
    } 

} 

public class Article:TextContext 
{ 
    public int ArticleID { get; set; } 
    public bool IsReady { get; set; } 
} 

public class NewsArchive:TextContext 
{ 
    public int NewsArchiveID { get; set; } 
} 

теперь, когда вы инициализировать новый Article или NewsArchive вас см. поля, методы .. базового класса.