C# 避免为接口属性重复代码

Tom*_*len 1 c# interface class repeat

鉴于接口:

interface IVotable
{
    int TotalUpvotes { get; }
    int TotalDownvotes { get; }
    int TotalVoteScore { get; }
}
Run Code Online (Sandbox Code Playgroud)

通过一个实现:

public class Comment : IVotable
{
    public int TotalUpvotes { get; private set; }
    public int TotalDownvotes { get; private set; }
    public int TotalVoteScore { get { return TotalUpvotes - TotalDownvotes + 1 ; } }
}
Run Code Online (Sandbox Code Playgroud)

避免TotalVoteScore在每个类中实现相同方式的最佳方法是什么?

Lee*_*Lee 5

如果TotalVoteScore始终以相同的方式计算,您可以将其作为 的扩展方法IVotable

public static int TotalVoteScore(this IVotable v) {
    return v.TotalUpvotes - v.TotalDownvotes + 1
}
Run Code Online (Sandbox Code Playgroud)


Eni*_*ity 5

如果只是TotalVoteScore您不想重新实现,那么这就是要走的路:

public interface IVotable
{
    int TotalUpvotes { get; }
    int TotalDownvotes { get; }
    int TotalVoteScore { get; }
}

public abstract class VotableBase : IVotable
{
    public abstract int TotalUpvotes { get; protected set; }
    public abstract int TotalDownvotes { get; protected set; }
    public virtual int TotalVoteScore { get { return TotalUpvotes - TotalDownvotes + 1 ; } }
}

public class Comment : VotableBase
{
    public override int TotalUpvotes { get; protected set; }
    public override int TotalDownvotes { get; protected set; }
}
Run Code Online (Sandbox Code Playgroud)