abstract class 中的无主体抽象方法有什么问题?
What's wrong with bodyless abstract methods in abstract class?
我正在重构一个预先存在的解决方案。我使用 ReSharper,我注意到代码检查规则被触发。有一个抽象 class 具有无主体方法签名,目的是强制派生 classes(其中有几个)。据我所知,这是(或至少是)正确的做事方式。但是,ReSharper 抱怨 "Type member is never accessed via base type" 和 "Only overrides of [the methods] are used." 以下是复制相关问题的示例代码:
public abstract class MyAbstractClass
{
public abstract void CreateSomething();
public abstract void ReadSomething();
public abstract void InsertSomething();
}
public class MyDerivedClass : MyAbstractClass
{
public override void CreateSomething()
{
throw new NotImplementedException();
}
public override void ReadSomething()
{
throw new NotImplementedException();
}
public override void InsertSomething()
{
throw new NotImplementedException();
}
}
顺便说一下,还有其他成员排除了使抽象 class 成为接口的可能性。 ReSharper 建议对摘要中的 3 个方法进行更改 class。它的建议是让它们成为受保护的、虚拟的、非抽象的,或者简单地将它们从抽象 class 中删除,只在派生的 classes 中。最初编写此代码的人旨在为每个派生 class 实现这些方法,并且这些方法在派生 class 中是 public。那么,有什么方法可以改变它以使其更有效吗?如果不是,为什么 ReSharper 对此提出异议?
因为您永远不会使用 MyAbstractClass 类型的引用来访问该方法,所以将其设为抽象成员毫无意义——您可以将其完全排除在基础 class 之外,所有内容都会编译美好的。
我正在重构一个预先存在的解决方案。我使用 ReSharper,我注意到代码检查规则被触发。有一个抽象 class 具有无主体方法签名,目的是强制派生 classes(其中有几个)。据我所知,这是(或至少是)正确的做事方式。但是,ReSharper 抱怨 "Type member is never accessed via base type" 和 "Only overrides of [the methods] are used." 以下是复制相关问题的示例代码:
public abstract class MyAbstractClass
{
public abstract void CreateSomething();
public abstract void ReadSomething();
public abstract void InsertSomething();
}
public class MyDerivedClass : MyAbstractClass
{
public override void CreateSomething()
{
throw new NotImplementedException();
}
public override void ReadSomething()
{
throw new NotImplementedException();
}
public override void InsertSomething()
{
throw new NotImplementedException();
}
}
顺便说一下,还有其他成员排除了使抽象 class 成为接口的可能性。 ReSharper 建议对摘要中的 3 个方法进行更改 class。它的建议是让它们成为受保护的、虚拟的、非抽象的,或者简单地将它们从抽象 class 中删除,只在派生的 classes 中。最初编写此代码的人旨在为每个派生 class 实现这些方法,并且这些方法在派生 class 中是 public。那么,有什么方法可以改变它以使其更有效吗?如果不是,为什么 ReSharper 对此提出异议?
因为您永远不会使用 MyAbstractClass 类型的引用来访问该方法,所以将其设为抽象成员毫无意义——您可以将其完全排除在基础 class 之外,所有内容都会编译美好的。