Родительский класс C # с интерфейсными свойствами, которые могут меняться в соответствии с подклассами - PullRequest
1 голос
/ 21 марта 2011

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

public interface IBaseline
{
    string CommonToAll { get; }
    int AnotherCommon { get; }

    void CommonFunction();
}

Теперь, производные новые классы из интерфейса IBaseline

public class CDerived1 : IBaseline
{
    private string CommonToAll
    { get { return Whatever; }}

    private int AnotherCommon
    { get { reutrn WhateverInt; }}

    public void CommonFunction)
    { // do something with this classes specific elements...  }


    // now, here are some custom things specific to this class
    private string CustomToThisClass;

    private int CustomFunction()
    { // do something }
}

public class CDerived2: IBaseline
{
    private string CommonToAll
    { get { return Whatever; }}

    private int AnotherCommon
    { get { reutrn WhateverInt; }}

    public void CommonFunction)
    { // do something with this classes specific elements...  }

    // again, these are totally different to the second derived class
    private string TotallyDifferent;

    private bool DiffFunction( int anyParm )
    {  // do something different }

}

Теперь, для моей путаницы в реализации.Я хочу создать новый класс с полем, которое может иметь ЛЮБУЮ структуру IBaseline, но не знаю, какая версия во время компиляции.

public class OtherClass
{
   IBaseline GenericInstance;
   ...
   ...

   public void CommonAccessFunction()
   {
      // call the common function that is generic no matter WHAT 
      // subclassed instance is used.
      GenericInstance.CommonFunction();
   }
}

Ответы [ 2 ]

2 голосов
/ 21 марта 2011

Сделайте это универсальным:

public class OtherClass<T> where T : IBaseline
{
    public T GenericInstance { get; private set;}

    public OtherClass(T genericInstance)
    {
        this.GenericInstance = genericInstance;
    }
}
1 голос
/ 21 марта 2011

почему вы не можете просто передать экземпляр IBaseLine в OtherClass, либо через конструктор (как в примере ниже), либо через свойство?

public class OtherClass
{
   IBaseline GenericInstance;

   public OtherClass(IBaseline instance)
   {
        GenericInstance=instance;
   }

   public void CommonAccessFunction()
   {
      // call the common function that is generic no matter WHAT 
      // subclassed instance is used.
      GenericInstance.CommonFunction();
   }
}

либо я что-то упустил, либо ваш вопрос не очень понятен. Кажется, что вы хотите сделать что-то, что является стандартной практикой, ваша реализация OtherClass ничего не знает о том, какую реализацию IBaseline она использует, просто что она использует некоторую реализацию ...

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