Как получить доступ к функциям из абстрактного класса, не делая их статичными? - PullRequest
1 голос
/ 08 января 2010

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

public abstract Class A
{
 A()
 {}
 public void display()
 {}
}

public Class B:A
{
 base.A() // this is accessible
 this.display() // this is not accessible if i dont make this function static above
}

Ответы [ 3 ]

2 голосов
/ 08 января 2010

Это не правда. Вам не нужно делать Display () статичным; Вы можете позвонить это свободно из подкласса. С другой стороны, вы не можете вызывать конструктор таким образом.

Возможно, это просто ошибка в примере, но реальная проблема с вашим кодом состоит в том, что вы не можете поместить вызовы методов в середину определения класса.

Попробуйте это:

public abstract class A
{
 public void Display(){}
}

public class B:A
{
 public void SomethingThatCallsDisplay()
 {
  Display();
 }
}
2 голосов
/ 08 января 2010

Ваш пример не скомпилируется, вы можете рассмотреть что-то вроде этого:

using System;

public abstract class A
{
    protected A()
    {
        Console.WriteLine("Constructor A() called");
    }
    public void Display()
    {
        Console.WriteLine("A.Display() called");
    }
}

public class B:A
{
    public void UseDisplay()
    {
        Display();
    }
}

public class Program
{
    static void Main()
    {
        B b = new B();
        b.UseDisplay();
        Console.ReadLine();
    }
}

Выход:

Constructor A() called
A.Display() called

Примечание: создание нового B () неявно вызывает A (); Я должен был сделать конструктор A защищенным, чтобы предотвратить эту ошибку: «A.A ()» недоступен из-за уровня защиты »

0 голосов
/ 08 января 2010

Вот как вы можете это сделать ..

public abstract class A
{
    public virtual void display() { }
}

public class B : A
{
    public override void display()
    {
        base.display();
    }

    public void someothermethod()
    {
        this.display();
    }
}
...