【发布时间】:2015-07-09 12:42:53
【问题描述】:
我想将 IClasses 的实现注入到其他一些客户端类中。目前的设计使得某些函数具有公共代码,我不想在 IClass 的实现中重复这些代码。为此,我引入了一个抽象类,它存储了 IClasses 的实现将从中继承的通用功能。我有以下类结构。
public interface IClasses
{
string CommonFunc1();
string CommonFunc2();
string SpecialFunc1();
string SpecialFunc2();
}
public abstract class BaseClass : IClasses
{
public string CommonFunc1()
{
return "";
}
public string CommonFunc2()
{
return "";
}
public abstract string SpecialFunc1();
public abstract string SpecialFunc2();
}
public class Imple1 :BaseClass, IClasses
{
public override string SpecialFunc1()
{
return "11";
}
public override string SpecialFunc2()
{ return "12"; }
}
public class Imple2 :BaseClass, IClasses
{
public override string SpecialFunc1()
{
return "21";
}
public override string SpecialFunc2()
{ return "22"; }
}
我想知道这个设计是否可以改进? Visual Studio 一直抱怨接口是多余的,因为抽象类中已经存在所有内容。我只想在消费类中为 DI 使用接口。如果有冗余,我该如何删除?
【问题讨论】:
-
副手,我看不出有什么可以改进的。这是一个很常见的模式。不过,我尽量避免继承超过 1 到 2 层。比这更深,将一些功能移动到单独的接口/类中可能会更好。此外,在 .NET 中,通用约定是大写驼峰式所有函数。
-
谢谢肯。 Visual Studio 一直抱怨接口是多余的,因为抽象类中已经存在所有内容,所以我认为还有改进的余地。
-
猜你正在使用 Resharper 什么的。我的基本 VS 安装没有抱怨。因为它,它有点多余,但可能会随着您的解决方案成熟而改变。如果你在基类的两个常用函数中添加 virtual,它会抱怨吗?这是我认为缺少的一件事。通常,您会希望允许子类覆盖它们。
-
@user20358 即使你从类中删除了
IClasses声明它仍然会实现IClasses接口,因为它从基类继承它,所以你会仍然可以将它传递给采用IClasses参数的方法。试试看。 -
我最大的问题是:
IClasses的所有消费者都需要它的所有方法吗?如果没有,你就违反了Interface Segregation Principle,这是你可以改进的。
标签: c# oop dependency-injection software-design ooad