我正在创建一个对象结构,并且希望所有基类的子类都被强制实现一个方法。
我能想到的唯一方法是:
抽象类 - 这样做可行,但基类有一些有用的辅助函数,会被某些子类使用。
接口 - 如果仅应用于基类,则子类不必实现该函数,只需基类实现即可。
这是否可行?
N.B. 这是一个.NET 2 应用程序。
我正在创建一个对象结构,并且希望所有基类的子类都被强制实现一个方法。
我能想到的唯一方法是:
抽象类 - 这样做可行,但基类有一些有用的辅助函数,会被某些子类使用。
接口 - 如果仅应用于基类,则子类不必实现该函数,只需基类实现即可。
这是否可行?
N.B. 这是一个.NET 2 应用程序。
你可以在一个有其他已实现方法的类中拥有抽象方法。与接口相比的优势在于,您可以在类中包含一些代码,并强制新对象填写抽象方法的细节。
public abstract class YourClass
{
// Your class implementation
public abstract void DoSomething(int x, int y);
public void DoSomethingElse(int a, string b)
{
// You can implement this here
}
}
一个抽象类 - 可以使用,但是基类有一些有用的帮助函数被某些子类使用
一个抽象类并不需要所有提供的函数都是抽象的。
abstract class Base {
public void Foo() {} // Ordinary method
public virtual void Bar() {} // Can be overridden
public abstract void Xyz(); // This one *must* be overridden
}
请注意,如果您将public
替换为protected
,则标记的方法将仅对基类和子类可见。// Your interface
interface IFoo { void A(); void B; }
// A "default" implementation of that interface
abstract class FooBase : IFoo
{
public abstract void A();
public void B()
{
Console.WriteLine("B");
}
}
// A class that implements IFoo by reusing FooBase partial implementation
class Foo : FooBase
{
public override void A()
{
Console.WriteLine("A");
}
}
// This is a different class you may want to inherit from
class Bar
{
public void C()
{
Console.WriteLine("C");
}
}
// A class that inherits from Bar and implements IFoo
class FooBar : Bar, IFoo
{
public void A()
{
Console.WriteLine("Foobar.A");
}
public void B()
{
Console.WriteLine("Foobar.B");
}
}
以下是带参数的完整工作线程示例(.netcore 2.2):
class User{
public string Name = "Fen";
}
class Message{
public string Text = "Ho";
}
// Interface
interface IWorkerLoop
{
// Working with client message
string MessageWorker(string msg);
}
// AbstractWorkerLoop partial implementation
public abstract class AbstractWorkerLoop : IWorkerLoop
{
public User user;
public Message msg;
// Append session object to loop
public abstract AbstractWorkerLoop(ref User user, ref Message msg){
this.user = user;
this.msg = msg;
}
public abstract string MessageWorker(string msg);
}
// Worker class
public class TestWorkerLoop : AbstractWorkerLoop
{
public TestWorkerLoop(ref User user, ref Message msg) : base(user, msg){
this.user = user;
this.msg = msg;
}
public override string MessageWorker(string msg){
// Do something with client message
return "Works";
}
}