2008-12-12 15 views
5

Chcę mieć widok abstrakcyjny dla dowolnego typu interfejsu użytkownika (strony lub okna). W tym celu muszę użyć interfejsu (IView), w którym mogę stosować tylko reguły dotyczące widoku. W rzeczywistości chcę ustawić podstawową funkcję kompilacji, aby zapewnić jej dziedzictwo.Interfejs lub Klasa abstrakcyjna do spełnienia

Tak więc w ten sposób muszę użyć klasy abstrakcyjnej. Problemem jest

1) Interfejs mieć tylko zasady 2) widok (forma postaci wstęgi lub okno) nie może dziedziczyć dłużej ponieważ już dziedziczone z okna lub internetowej formie

W jaki sposób można to zrobić? Wielkie dzięki

Odpowiedz

5

Czy dodane funkcje zmieniają definicję klasy, czy też po prostu tworzysz funkcje manipulowania danymi, które są już częścią klasy?

Jeśli potrzebujesz przedefiniować aspekty klasy bazowej tych dwóch klas, to tak, musisz zmienić strukturę dziedziczenia. Ale jeśli funkcje będą po prostu manipulować danymi, które są już częścią klasy, to sugerowałbym, abyś używał interfejsu i tworzył funkcje narzędziowe.

Oto niezdarny przykładem tego, co mam na myśli:

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); 
    } 
} 

Twoje dwie klasy UI są prawdopodobnie związane w ten sposób. Wyobrażam sobie, że to, co musisz zrobić w sposób przekrojowy, zostanie rozwiązane za pomocą metody użyteczności, takiej jak ta, którą stworzyłem. Stworzyłem metodę PetUtils.Print jako metodę rozszerzenia, ponieważ stworzy to ekspresyjną iluzję metody instancji. Jeśli nie używasz C# 3, po prostu usuń "this" z public static void Print(this IPet pet).

4

Możesz dziedziczyć konkretną klasę (formularz internetowy/formularz okna), zadeklarować swoją klasę jako abstrakt i nadal implementować interfejs.

System.Web.UI.Page przykład:

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() { } 
} 

Daje to korzyści z interfejsu i sposobu beton bar();

0

co chcę zrobić, to coś takiego

Publicznej MustInherit klasy ControllerBase (M jako {ModelBase, Nowy}, V, {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

Klasa publiczna 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

Interfejs publiczny IView

WriteOnly Property Controller() As BaseController 

Interfejs Koniec

Powiązane problemy