2009-12-04 4 views
0

Dans la classe parente suivante SQLstatement, comment puis-je faire initialize()abstrait mais gardez Execute() virtuelle?Comment puis-je avoir des méthodes abstraites et virtuelles dans une classe?

using System; 
using System.Collections.Generic; 

namespace TestSql28374 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      object item = new object(); 
      List<string> properties = new List<string>(); 

      SqlCreateStatement sqlCreateStatement = new SqlCreateStatement(properties); 
      sqlCreateStatement.Execute(); 

      SqlInsertStatement sqlInsertStatement = new SqlInsertStatement(item, properties); 
      sqlInsertStatement.Execute(); 

      Console.ReadLine(); 
     } 
    } 

    public class SqlStatement 
    { 
     protected List<string> properties; 
     protected object item; 
     protected string sql; 

     public SqlStatement(List<string> properties) 
     { 
      this.properties = properties; 
     } 

     protected virtual void Initialize() //should be abstract 
     { } 

     public virtual void Execute() 
     { 
      Console.WriteLine("Sending to database: " + sql); 
     } 
    } 

    public class SqlCreateStatement : SqlStatement 
    { 

     public SqlCreateStatement(List<string> properties) 
      : base(properties) 
     { 
      Initialize(); 
     } 

     protected override void Initialize() 
     { 
      sql = "CREATE TABLE..."; 
     } 
    } 

    public class SqlInsertStatement : SqlStatement 
    { 
     public SqlInsertStatement(object item, List<string> properties) 
      : base(properties) 
     { 
      this.item = item; 

      Initialize(); 
     } 

     protected override void Initialize() 
     { 
      sql = "INSERT INTO..."; 
     } 
    } 
} 

Répondre

9

font une classe abstraite

+1

Non .. avez-vous essayé? –

+2

Les interfaces NOP empêchent les corps. Le résumé permet les deux. –

+1

Non, c'est la joie! :) – Quibblesome

3

DECLARE SQLstatement comme abstraite. Ne pouvez-vous pas le déclarer comme abstrait?

6

public abstract class SqlStatement 
    { 
     protected List<string> properties; 
     protected object item; 
     protected string sql; 

     public SqlStatement(List<string> properties) 
     { 
      this.properties = properties; 
     } 

     protected abstract void Initialize(); 

     public virtual void Execute() 
     { 
      Console.WriteLine("Sending to database: " + sql); 
     } 
    } 
+0

Comment exécutez-vous SqlStatement :: Execute, dans la chaîne d'héritage? –

+0

Cela dépend? Voulez-vous dire immédiatement ou chez l'ancêtre? Appelez immédiatement Execute, dans l'ancêtre dont vous avez besoin base.Execute. – Lloyd

+0

oui exactement, la répartition virtuelle ne fonctionnera pas pour accéder à SqlStatatement :: Execute –

1
public abstract class SqlStatement { 
... 
protected abstract void Initialize(); //abstract 
.... 
} 
Questions connexes