Интерфейс или абстрактный класс для выполнения требования

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

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

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

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

12.12.2008 17:26:30
3 ОТВЕТА
РЕШЕНИЕ

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

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

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

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).

5
12.12.2008 18:10:04

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

Пример 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 ();

4
12.12.2008 17:53:21

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

Открытый класс ControllerBase класса MustInherit (из 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  

Конечный класс

Открытый класс 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

Конечный класс

 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

Конечный класс

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

WriteOnly Property Controller() As BaseController

Конец интерфейса

0
12.12.2008 18:57:08