如何在C#中实现类之间的共享行为(没有课程的多重继承)

gab*_*abe 1 c# inheritance code-reuse design-patterns multiple-inheritance

更新:所以这里的每个人都告诉我,我只需要重新开始我如何设计课程(顺便说一句,谢谢大家的优秀答案!).接下来,我开始对战略模式进行广泛阅读.我想创建从抽象基类继承的行为类(或策略类).然后,Candidate类将具有不同抽象基类/类的属性作为Type行为或策略.也许是这样的:

public abstract class SalaryStrategy {
    public abstract decimal Salary { get; set; }
    public abstract decimal Min { get; set; }
    public abstract decimal Mid { get; set; }
    public decimal CompaRatio {
        get {
            if (this.Mid == 0) { return 0; }
            else { return this.Salary / this.Mid; }
        }
    }
}

public class InternalCurrentSalaryStrategy {
    public override decimal Salary { get; set; }
    public override decimal Min {
        get { return this.Salary * .25m; }
        set { }
    }
    public override decimal Mid { get; set; }
}

public class Candidate {
    public int Id { get; set; }
    public string Name { get; set; }
    public SalaryStrategy CurrentSalaryStrategy { get; set; }
}

public static void Main(string[] args) {
    var internal = new Candidate();
    internal.CurrentSalaryStrategy = new InternalCurrentSalaryStrategy();
    var internalElp = new Candidate();
    internalElp.CurrentSalaryStrategy = new InternalCurrentSalaryStrategy();
    var elp = new Candidate();
    // elp.CurrentSalaryStrategy can stay null cause it's not used for elps
}
Run Code Online (Sandbox Code Playgroud)

有什么意见或建议吗?


原文问题:

我正在努力学习并更加精通设计模式和原则.我目前正在为一些难以理解的课程设计.这是代码的一个非常简洁的版本:

public class Candidate {
    public int Id { get; set; }
    public string Comments { get; set; }
    // lots more properties and behaviors...
}

public class InternalCandidate : Candidate {
    public decimal CurrentMid { get; set; }
    public decimal CurrentMax {
         get { return this.CurrentMin * 1.3m;
    }
    // lots more properties and behaviors...
}

public class EntryLevelCandidate : Candidate {
    public string Gpa { get; set; }
    // lots more properties and behaviors...
}

public class InternalEntryLevelCandidate /* what do I inherit here??? */ {
    // needs all of the properties and behaviors of
    // EntryLevelCandidate but also needs the CurrentMin and
    // CurrentMax (and possibly more) in InternalCandidate
}
Run Code Online (Sandbox Code Playgroud)

InternalEntryLevelCandidate类主要是EntryLevelCandidate,但需要共享InternalCandidate的一些实现.我说实现是因为我不希望实现不同或重复,否则我会使用一个接口来进行常见的契约,并在每个类中都有具体的实现.InternalCandidate属性和行为的某些实现需要是通用的或共享的.我读过有关C++和Ruby mixins的内容,它们似乎与我想要做的类似.我还阅读了这篇有趣的博客文章,该文章讨论了一种行为类型的想法,其中一个类能够继承多个行为,同时仍然保持一个"是一个"关系:http://www.deftflux.net/blog/post/ A-good-design-for-multiple-implementation-inheritance.aspx.这似乎传达了我想要的东西.任何人都可以通过良好的设计实践为我如何实现这一目标指明方向吗?

Tri*_*nko 5

不可变数据值类. 如果各种Candidate子类中的任何属性表示某种有意义的数据值,请使用您需要的行为为其创建不可变类.然后,每个不同的Candidate子类都可以使用数据类型,但您的代码仍然封装在数据类中.

扩展方法. 这些可以重载以适用于任何类.

我会避免使用装饰器模式并坚持编译/反射功能.

组成. 立即在不同的类中开发独特的行为,并围绕它们构建候选类,而不是在候选类中编写独特的行为,并尝试提取其功能以便稍后在相关类中使用.

根据您使用类的方式,您还可以实现并使用显式和隐式转换运算符到相关类型,因此您可以实际将对象转换为类型/实现,而不是重新实现接口(您希望避免).你需要什么目的.

我刚才想到的另一件事,就是最后一段,就是有一个租赁系统,你的类产生了适当类型的对象,允许它被操纵,然后消耗它以吸收更新的信息.