我有一个界面:
public interface IUser
{
}
然后是2个实现此接口的类:
public class User : IUser
{
}
public class AdminUser : IUser
{
}
现在我看到的问题是,在界面中实现方法时,User和AdminUser之间存在重复的代码。
我可以引入一个抽象类来实现User和AdminUser之间的公共代码吗?
我不希望AdminUser继承用户。
答案 0 :(得分:13)
是。你可以。
public abstract class BaseUser : IUser
{
}
public class User : BaseUser
{
}
public class AdminUser : BaseUser
{
}
答案 1 :(得分:4)
听起来你应该引入一个UserBase
类,User
和AdminUser
可以从中继承具有共享代码的
class UserBase : IUser {
// Shared Code
}
class User : UserBase { }
class AdminUser : UserBase { }
答案 2 :(得分:3)
您的班级User
应该是AdminUser
从类的名称看,您的类User
应该是基类,而AdminUser
应该从该类继承。如果不是这种情况,那么您可以为User
和AdminUser
创建基类,在基类中实现您的接口,并在User
和AdminUser
中继承该接口。 / 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 ;
}