Можно ли вызвать метод класса Abstract в производном классе или любом другом классе - PullRequest
1 голос
/ 18 июля 2011

Можно ли вызвать метод класса Abstract в производном классе или любом другом классе. Мой код ниже, я хочу вызвать метод Abstr Describe() в методе Main программы. Является ли это возможным? если ответ да как?

class Program
{
    public void Main()
    {
        //I want to call the Describe() method here, how do i do that
        Console.ReadLine();
    }
}

public abstract class Abstr
{
    public void Describe()
    {
        //do something
    }
}

Ответы [ 6 ]

9 голосов
/ 18 июля 2011

Поскольку ваш метод не является статическим, вам нужно инициализировать переменную из этого абстрактного класса и вызвать этот метод из него.Для этого вы можете наследовать абстрактный класс по конкретному классу, а затем вызывать этот метод.Обратите внимание, что абстрактный класс не может быть инициализирован, поэтому такой конструктор, как Abstr abstr = new Abstr();, недопустим.Итак:

public abstract class Abstr
{
    public void Describe()
    {
        //do something
    }
}

public class Concrete : Abstr
{
   /*Some other methods and properties..*/ 
}

class Program
{
    public void Main()
    {
        Abstr abstr = new Concrete();
        abstr.Describe();
        Console.ReadLine();
    }
}
4 голосов
/ 18 июля 2011

Вы должны иметь возможность использовать Abstr.Describe() напрямую. Это статический метод, поэтому абстрактный класс не должен иметь значения.

Редактировать

Теперь, когда код в вопросе был отредактирован и ключевое слово static удалено в методах, этот ответ больше не применяется.

1 голос
/ 18 июля 2011

Q: можно ли вызвать метод класса Abstract в производном класс

A: Конечно, если он общедоступный, защищенный (и того же класса или подкласса), или внутренний (и той же сборки)

Q: Любой другой класс?

A: Конечно, если он общедоступный или внутренний (и той же сборки)

Хорошая ссылка: http://agsmith.wordpress.com/2007/12/15/internal-and-protected/

0 голосов
/ 18 июля 2011

Да, если определение метода в супертипе доступно для подтипа (и кода, который хочет вызвать метод).

Вот пример кода. Будет ли вызываться определение метода в подтипе или супертипе, зависит от того, как определено переопределение:

public abstract class AbstractSupertype
{
  public void Alpha()
  {
    Console.WriteLine( "AbstractSupertype.Alpha()" ) ;
    return ;
  }
  public abstract void Bravo() ;
  public virtual  void Charlie()
  {
    Console.WriteLine( "AbstractSupertype.Charlie()" ) ;
    return ;
  }
}

public class ConcreteSubtype : AbstractSupertype
{
  public new void Alpha()
  {
    Console.WriteLine( "ConcreteSubtype.Alpha()" ) ;
  }
  public override void Bravo()
  {
    Console.WriteLine( "ConcreteSubtype.Bravo()" ) ;
  }
  public override void Charlie()
  {
    Console.WriteLine( "ConcreteSubtype.Charlie()" ) ;
  }
}
class Program
{
  static void Main( string[] args )
  {
    ConcreteSubtype   subTypeInstanceReference   = new ConcreteSubtype() ;
    AbstractSupertype superTypeInstanceReference = subTypeInstanceReference ;

    subTypeInstanceReference.Alpha()     ; // invokes subtype's method
    superTypeInstanceReference.Alpha()   ; // invokes supertype's method

    subTypeInstanceReference.Bravo()     ; // invokes subtype's method
    superTypeInstanceReference.Bravo()   ; // invokes subtype's method

    subTypeInstanceReference.Charlie()   ; // invokes subtype's method
    superTypeInstanceReference.Charlie() ; // invokes subtype's method

    return ;
  }
}
0 голосов
/ 18 июля 2011

да можно код: здесь

Это работает и для нестатического метода

0 голосов
/ 18 июля 2011

Достаточно позвонить

РЕДАКТИРОВАТЬ:

Исходное сообщение было изменено, поэтому этот ответ недействителен.

 Abstr.Describe();

С уважением.

...