2个类实现相同的接口,重复的代码

时间:2014-02-07 17:55:28

标签: c# .net oop interface

我有一个界面:

public interface IUser
{

}

然后是2个实现此接口的类:

public class User : IUser 
{

}

public class AdminUser : IUser
{

}

现在我看到的问题是,在界面中实现方法时,User和AdminUser之间存在重复的代码。

我可以引入一个抽象类来实现User和AdminUser之间的公共代码吗?

我不希望AdminUser继承用户。

6 个答案:

答案 0 :(得分:13)

是。你可以。

public abstract class BaseUser : IUser
{

}

public class User : BaseUser 
{

}

public class AdminUser : BaseUser
{

}

答案 1 :(得分:4)

听起来你应该引入一个UserBase类,UserAdminUser可以从中继承具有共享代码的

class UserBase : IUser { 

  // Shared Code

}

class User : UserBase { } 

class AdminUser : UserBase { } 

答案 2 :(得分:3)

您的班级User应该是AdminUser

的基类

从类的名称看,您的类User应该是基类,而AdminUser应该从该类继承。如果不是这种情况,那么您可以为UserAdminUser创建基类,在基类中实现您的接口,并在UserAdminUser中继承该接口。 / p>

public interface IUser
{
    void SomeMethod();
}


public abstract class User : IUser
{
    public abstract void SomeMethod();
}

public class AdminUser : User
{
    public override void SomeMethod()
    {
        throw new NotImplementedException();
    }

}

public class NormalUser : User
{
    public override void SomeMethod()
    {
        throw new NotImplementedException();
    }

}

答案 3 :(得分:2)

是的,您可以在摘要中创建功能相同的具体方法。

创建存在共同需求但实现不同的虚拟方法

然后在继承类中,为每个实现添加唯一的方法

答案 4 :(得分:2)

你问题的核心在于你似乎试图用接口来描述一个类是什么,而不是它的功能。接口最适用于指定IAuthorizeable或IEnumerable等内容。它们表明了共同主题的不同行为。

对于像你这样的案例,正如其他人所建议的那样,你想要使用继承,除非你可以改变你的结构。我的偏好是创建一个用户类,其中包含变化而不是继承的部分的策略。

继承共享功能和允许差异可扩展之间存在很大差异。如果用接口编写User而不是创建基类,如果将来需要添加更多角色,则只需要添加另一个更改行为的实现,而不是创建另一个可能与其共享不同内容的子类。另外两个班。

一个例子:

class User
{
  private IAuthenticator authenticator;
  public string Name { get; set; }
  public Guid Id { get; set; }
  public User(string name, Guid id, IAuthenticator authenticator)
  {
    Name = name;
    Id = id;
    this.authenticator = authenticator;
  }
  public Rights Authenticate()
  {
    return authenticator.Authenticate(Name, Id);
  }
}

验证者的位置可能是:

public class WebAuthenticator : IAuthenticator
{
  public Rights Authenticate(string name, Guid id)
  {
    // Some web specific authentication logic
  }
}

和权利:

[Flags]
public enum Rights
{
  None = 0, Read = 1, Write = 1 << 1, Execute = 1 << 2
}

最终结果是您的代码可重用,可扩展且灵活。通常,用户是管理员的事实不应该为用户类提供额外的逻辑,而是限制使用特定实例的事物。

答案 5 :(得分:1)

这是接口而不是抽象类的问题:没有共享实现。接口旨在作为缺少多重继承的解决方法。

通常,您的对象模型应该是一个小型继承树林。

一种解决方案是创建一个小型混合类,它提供所需的功能并实现接口。在您的类中包含它,并通过调用混合实现接口的传递方法公开其方法。

interface IFoo
{
  int MethodA() ;
  int MethodB() ;
}
class IFooMixin : IFoo
{
  public int MethodA() { ... }
  public int MethodB() { ... }
}
class Widget : IFoo
{
  private IFooMixin IFooImplementation = new IFooMixin() ;
  public int MethodA()
  {
     int rc ;
     // inject your specific behavior here
     rc = IFooImplementation.MethodA() ;
     // and/or inject it here
     return rc ;
  }
  public int MethodB()
  {
     int rc ;
     // inject your specific behavior here
     rc = IFooImplementation.MethodB() ;
     // and/or inject it here
     return rc ;
  }