2008-12-12 27 views
5

Quiero tener una vista abstracta para cualquier tipo de IU (web o ventana). Para hacer eso, debo usar la interfaz (IView) en la que solo puedo aplicar reglas sobre la vista. De hecho, quiero establecer una función completa básica para proporcionar a sus herencias.Interfaz o clase abstracta para cumplir el requisito

Así que de esta manera, debo usar la clase abstracta. El problema es

1) sólo para la interfaz tiene reglas 2) La opinión (forma de banda o de ventana) no pueden heredar nada más, ya que ya se hereda de la ventana o formulario web

¿Cómo puedo hacer eso? Muchas gracias

Respuesta

5

¿Las funciones que agrega cambian la definición de lo que es la clase, o simplemente creará funciones para manipular datos que ya forman parte de la clase?

Si necesita redefinir aspectos de la clase base de estas dos clases, entonces sí, tendrá que cambiar su estructura de herencia. Pero si las funciones simplemente manipulan los datos que ya forman parte de la clase ahora, le sugiero que utilice la interfaz y cree funciones de utilidad.

Aquí está un ejemplo torpe de lo que quiero decir:

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

Sus dos clases de interfaz de usuario se relacionan quizá de esta manera. Me imagino que lo que tienes que hacer de forma transversal se resolverá con un método de utilidad como el que he creado. Creé el método PetUtils.Print como método de extensión, ya que creará la ilusión expresiva de un método de instancia. Si no está utilizando C# 3, simplemente elimine "this" del public static void Print(this IPet pet).

4

Puede heredar una clase concreta (formulario web/forma de ventana), declarar el resumen de su clase y seguir implementando una interfaz.

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

Esto le da la ventaja de la interfaz y la barra método concreto();

0

lo que quiero hacer es algo como esto

Pública MustInherit Clase ControllerBase (De M Como {ModelBase, Nuevo}, V Como {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

Clase pública 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

interfaz pública IView

WriteOnly Property Controller() As BaseController 

interfaz Fin

Cuestiones relacionadas