При определении абстрактного класса, можете ли вы заставить дочерний элемент определить свойство / метод, определенный в родительском интерфейсе? - PullRequest
0 голосов
/ 05 марта 2020

Рассмотрим следующее определение класса.

public abstract class FooBase : IBar
{
  public int Value {get; set;}
  public string ToString() 
  {
    //Return a string.
  }
}

public interface IBar 
{
  int Value;
  string ToString();
}

FooBase - это базовый класс, обеспечивающий реализацию интерфейса IBar.

Как абстрактный класс, FooBase не может быть непосредственно созданным. Таким образом, другой класс должен быть производным от этого класса, чтобы он был полезен.

Теперь рассмотрим сценарий, в котором вам нужен объект типа FooBase, который реализует интерфейс IBar, однако для однократного указания c member IBar вам нужны дочерние элементы FooBase для его реализации, а не FooBase.

Есть ли способ реализовать / обратиться к члену в абстрактном классе, таком как FooBase, производный начиная с IBar, таким образом, что любой дочерний элемент FooBase должен реализовать один элемент из IBar, а не полагаться на базовые реализации FooBase?

Я предполагаю, что нет потому что компилятор говорит, что объявление значения типа public abstract int Value недопустимо, но я решил, что стоит спросить и проверить. Но, может быть, я ошибаюсь, и если так, есть ли правильный способ заставить дочернюю реализацию моего базового класса реализовать член из родительского интерфейса на моей базе?

Ответы [ 2 ]

4 голосов
/ 05 марта 2020

Компилируется просто отлично:

public abstract class FooBase : IBar
{
    public abstract int Value { get; set; }
}

public interface IBar
{
    int Value { get; }
}

Любой класс, производный от FooBase, должен переопределить Значение:

public class Concrete : FooBase
{
    public override int Value { get; set; }
}
4 голосов
/ 05 марта 2020

предположим, что нет, потому что компилятор сообщает, что объявление значения, такого как publi c abstract int Значение не разрешено

Конечно, это разрешено, это прекрасно компилируется :

interface IBar
{
    int Foo { get; set; }
    string Blah();
}

abstract class Base: IBar
{
    public abstract int Foo { get; set;}
    public string Blah() => null;
}

А теперь:

class Derived: Base
{
     //must implement Foo
}

Ваш код, кстати, не компилируется, вы не можете определять поля в интерфейсе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...