簡體   English   中英

C# 僅在選定的派生類中使用基類方法

[英]C# use base class methods in selected derived classes only

我有一些只能由某些派生類使用的通用函數。 為了只對每個函數編碼一次,我使用了一個基類。 我需要將函數定義為protected 以將它們隱藏在不使用它們的派生類中,因此無法使用virtual 和override,導致在這種情況下無法更改保護級別。 這是我的代碼。 這按照我想要的方式工作,但是 ios 沒有更好的方法來做到這一點?

  class Base
  {
    protected void Initialize()
    {
    }

    protected void doTask1()
    {
    }

    protected void doTask2()
    {
    }
}

class Derived1 : Base
{
    public void Initialize()
    {
        base.Initialize();
    }

    public new void doTask1()
    {
        base.doTask1();  
    }
}

class Derived2 : Base
{
    public void Initialize()
    {
        base.Initialize();
    }

    public new void doTask2()
    {
        base.doTask2();
    }
}

歡迎任何幫助......

doTask1() 應該只在 Derived1 類中可用,doTask2() 只在 Derived2 類中可用。 感謝@Fildor 的回答,我使用接口解決了這個問題。 所有派生類都派生自同一個基類。 基類實現接口中的所有功能。

public class Base : I_Derived1, I_Derived2 
{
  // implementations of all methods ...
  doTask1()  
  {  // ...   
  }
  doTask2()  
  {  // ...   
  }
  initialize()   
  {  // ...   
  }
{

public interface I_Derived1
{
  doTask1();
  initialize();
}
public interface I_Derived2
{
  doTask2();
  initialize();
}

class Derived1 : Base
{
}
class Derived2 : Base
{
}

// then the interfaces are used ...

I_Derived1 d1 = new Base();
I_Derived2 d2 = new Base();

d1.doTask1();
d2.initialize();
d2.doTask2();
// ...

這解決了我的問題,謝謝。 在我的實際項目中,一些類 Base 函數被 10 個或更多派生類使用,一些被全部使用,有些只被 2 或 3 個使用。使用對它有意義的函數。

我認為在這里只使用接口會更好:

public interface IInit{
  void Initialize();
}

public interface I1: IInit {
   void DoTask1();
}

public interface I2: IInit {
   void DoTask2();
}

public class Impl: I1, I2
{
   public void Initialize() { /*...*/  }
   public void DoTask1(){ /*...*/  }
   public void DoTask2(){ /*...*/  }
}

用法:

Impl obj = new Impl();
obj.Initialize();
obj.DoTask1(); // both
obj.DoTask2(); // visible

I1 obj1 = new Impl();
obj1.Initialize();
obj1.DoTask1();
// obj1.DoTask2(); < not visible

I2 obj2 = new Impl();
obj2.Initialize();
// obj2.DoTask1(); < not visible
obj2.DoTask2();

您甚至可以通過顯式接口實現更進一步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM