【问题标题】:How to connect multiple base classes to multiple subclasses through single interface in C#?如何通过 C# 中的单个接口将多个基类连接到多个子类?
【发布时间】:2019-05-23 19:49:05
【问题描述】:

我有三个类继承自我们称为 UpperCaseLetters 的更高基类。其中有类 LetterA、LetterB 和 LetterC。我希望构建一个接口,将它们分别连接到相应的子类LowerA、LowerB 和LowerC。我有一个接口,它有一个属性“UpperCaseLetter”,可以有效地存储或引用相应的大写字母。当我想在小写字母级别构造一个已知类型的单个对象时,这很好,因为我可以很容易地手动引用大写字母。

我需要构建一个能够查看我现有的大写字母集的脚本,并通过实现接口来构建相应的小写字母对象,这样我就可以得到一个小写字母对象,例如 LowerA,从引用它附加到的 LetterA 对象的接口实现属性。

在C#中,遍历一个循环,当我遇到一个似乎没有匹配的LowerCaseLetter对象的项目时,如何使用来自UpperCaseLetter子类(LetterA,LetterB或LetterC)的类型信息来动态构造一个对应的各个LowerCaseLetter 子类(LowerA、LowerB 或LowerC)的LowerCaseLetter 对象,而没有静态列出每个可用字母大小写的子类类型?

提前致谢

编辑:代码来说明我的意思:

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();
        } 
    }   

}

【问题讨论】:

  • 能否包含一些代码来演示问题
  • 不要迂腐,但“连接”在这个问题中是一个模棱两可的术语。可以通过多种方式关联类;请使用正确的,以便其他工程师知道您在说什么。如果你还没有找到合适的词来形容它,也许你还没有足够地考虑这个问题。我建议“大写字母”和“小写字母”之间没有继承关系,因为它们是互斥的,尽管它们可能都可以从简单的“字母”继承。
  • 为什么要将LetterLowerCaseUpperCase 分开?我确定您正在处理的实际代码是不同的,但如果类非常紧凑,也许最好重新设计一个可以同时处理它们的单个类。

标签: c# inheritance interface subclass


【解决方案1】:

为什么不把大写和小写字母都当作接口,只在接口上有一个方法来转换呢。

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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    相关资源
    最近更新 更多