2008-12-12 6 views
5

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

Таким образом, я должен использовать абстрактный класс. Проблема заключается в том

1) Интерфейс только правила 2) просмотра (веб-формы или формы окна) не могут наследовать больше, так что уже в наследство от окна или веб-формы

Как я могу это сделать? Большое спасибо

ответ

5

Будут ли функции, которые вы добавляете, изменить определение того, что представляет собой класс, или вы просто будете создавать функции для управления данными, которые уже являются частью класса?

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

Вот неуклюжий пример того, что я имею в виду:

using System; 

abstract class Pet { } 

class Dog : Pet, IPet 
{ 
    public String Name { get; set; } 
    public Int32 Age { get; set; } 
} 

class Cat : Pet, IPet 
{ 
    public String Name { get; set; } 
    public Int32 Age { get; set; } 
} 

interface IPet 
{ 
    String Name { get; set; } 
    Int32 Age { get; set; } 
} 

static class PetUtils 
{ 
    public static void Print(this IPet pet) 
    { 
     Console.WriteLine(pet.Name + " is " + pet.Age); 
    } 
} 

Ваши два класса пользовательского интерфейса, возможно, связаны таким образом. Я бы предположил, что то, что вам нужно сделать сквозным способом, будет решаться с помощью утилиты, подобной той, которую я создал. Я создал метод PetUtils.Print как метод расширения, так как это создаст выразительную иллюзию метода экземпляра. Если вы не используете C# 3, просто удалите «this» от public static void Print(this IPet pet).

4

Вы можете наследовать конкретный класс (веб-форму/форму окна), объявить абстрактный класс и по-прежнему реализовывать интерфейс.

System.Web.UI.Page пример:

public interface IView 
{ 
    void Foo(); 
} 

public abstract class BasePage : Page, IView 
{ 
    //honor the interface 
    //but pass implementation responsibility to inheriting classes 
    public abstract void Foo(); 

    //concrete method 
    public void Bar() 
    { 
     //do concrete work 
    } 
} 

public class ConcretePage : BasePage 
{ 
    //implement Foo 
    public override void Foo() { } 
} 

Это дает вам преимущество интерфейса и конкретный метод Bar();

0

то, что я хочу сделать что-то вроде этого

общественного MustInherit класса ControllerBase (Of M As {ModelBase, New}, V As {IView})

Inherits BaseController 

Dim model As M 
Dim view As V 
Public Sub New() 
    model = New M 
    view.Controller = Me 
    model.Controller = Me 
End Sub 
Public Overridable Function GetModel() As M 
    Return model 
End Function 
Public Overridable Function GetView() As V 
    Return view 
End Function 

End Class

Открытый класс BaseWindow

Inherits System.Windows.Forms.Form 
Implements IView 
Dim c As BaseController 

Public Function GetController() As BaseController 
    Return c 
End Function 

Friend WriteOnly Property Controller() As BaseController Implements IView.Controller 
    Set(ByVal value As BaseController) 
     c = value 
    End Set 
End Property 

End Class

Public Class BaseWeb 
Inherits System.Web.UI.Page 
Implements IView 

Dim c As BaseController 

Public Function GetController() As BaseController 
    Return c 
End Function 

Friend WriteOnly Property Controller() As BaseController Implements IView.Controller 
    Set(ByVal value As BaseController) 
     c = value 
    End Set 
End Property 

End Class

Открытый интерфейс IView

WriteOnly Property Controller() As BaseController 

End Interface

Смежные вопросы