Как подключить несколько базовых классов к нескольким подклассам через единый интерфейс в C #? - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть три класса, которые наследуются от более высокого базового класса, который мы будем называть UpperCaseLetters.Там есть классы LetterA, LetterB и LetterC.Я хочу построить интерфейс для подключения каждого из них к соответствующим подклассам LowerA, LowerB и LowerC.У меня есть один интерфейс, который имеет единственное свойство «UpperCaseLetter», которое эффективно хранит или ссылается на соответствующую заглавную букву.Это хорошо для случая, когда я хочу создать отдельный объект известного типа на уровне строчных букв, потому что я так же легко могу цитировать заглавные буквы вручную.

Мне нужно создать скрипт, способный просматривать мой существующий набор заглавных букв, и создать соответствующий объект строчных букв путем реализации интерфейса, чтобы я в итоге получил объект строчных букв, такой какLowerA, реализующее свойство из интерфейса, ссылающегося на объект LetterA, к которому он присоединен.

В C #, итерируя по циклу, когда я сталкиваюсь с элементом, который, кажется, не имеет соответствующего объекта LowerCaseLetter, как можно использовать информацию о типе из подкласса UpperCaseLetter (LetterA, LetterB или LetterC) для динамическогосоздать соответствующий объект LowerCaseLetter из соответствующего подкласса LowerCaseLetter (LowerA, LowerB или LowerC) без статического перечисления типов подклассов в каждом доступном регистре букв?

Заранее спасибо

РЕДАКТИРОВАТЬ: Кодчтобы продемонстрировать, что я имею в виду:

class UpperCaseLetter {
public bool Italic
}

class LetterA : UpperCaseLetter {

}

class LetterB : UpperCaseLetter {

}

interface LowerCaseLetter {
    public UpperCaseLetter OriginalLetter;
}

class LowerA : LetterA, LowerCaseLetter { 

}

class LowerB : LetterB, LowerCaseLetter {

}


void BuildLowerCaseLetters {
    foreach (var upperLetter in setOfImaginaryBuiltLetterObjects){
        //below is how the code currently works, but any time I build a new pair of 
        //classes, say, LetterD and LowerD, this section needs to be modified. 
        //Looking for a dynamic solution
        if (upperLetter is LetterA){
            new LowerA();
        } else if (upperLetter is LetterB){
            new LowerB();
        } 
    }   

}

1 Ответ

0 голосов
/ 24 декабря 2018

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

public interface IUpperCaseLetter
{
    ILowerCaseLetter ToLowerCase();
}

public interface ILowerCaseLetter
{
    IUpperCaseLetter ToUpperCase();
}

public class UpperA : IUpperCaseLetter
{
    public ILowerCaseLetter ToLowerCase()
    {
        return new LowerA();
    }
}

public class LowerA : ILowerCaseLetter
{
    public IUpperCaseLetter ToUpperCase()
    {
        return new UpperA();
    }
}

foreach (var upperLetter in setOfImaginaryBuiltLetterObjects)
{
     var lowerLetter = upperLetter.ToLowerCase();
}

Интерфейсы также могут наследовать другие, поэтому, если у вас есть что-то общее между прописными инижний регистр сделать общий интерфейс

public interface ILetter
{
    bool Italic{ get; }
}

public interface IUpperCaseLetter : ILetter
{
    ILowerCaseLetter ToLowerCase();
}

public interface ILowerCaseLetter : ILetter
{
    IUpperCaseLetter ToUpperCase();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...